typescript array.map 丢失返回类型
Posted
技术标签:
【中文标题】typescript array.map 丢失返回类型【英文标题】:typescript array.map lost returned type 【发布时间】:2019-05-21 16:34:38 【问题描述】:我预计以下代码中会出现类型错误,但对于 typescript 来说完全没问题,你能告诉我为什么吗?
export interface Structure
aaa: string;
export function f1(): Structure[] // OK for typescript, not for me
const result = [].map(certState =>
return
aaa: 'aaa',
ADDITIONAL_FIELD: 'asdf'
);
return result;
export function f2(): Structure[] // ERROR for typescript (and for me)
return [
aaa: 'sdf',
ADDITIONAL_FIELD: 'asdf'
]
Here is the link
谢谢!
【问题讨论】:
【参考方案1】:我刚刚了解到 Typescript 有一个仅针对对象字面量的精确类型的概念,因此 f1 不使用对象字面量,因此无法添加其他属性并且它对 typescript 有效。 f2 使用对象文字,因此不允许附加属性。这让我很害怕,但这就是 typescript 的工作原理
【讨论】:
【参考方案2】:错误是由于在f2()
中您直接返回结果。
如果您将f2()
更改为
export function f2(): Structure[]
const returnVal = [
aaa: 'sdf',
ADDITIONAL_FIELD: 'asdf'
]
return returnVal;
那么就不会有编译错误了。
TypeScript 使用structural typing 来确定类型兼容性,因此在您的f1()
代码中,result
属于类型
aaa: string,
ADDITIONAL_FIELD: string
[]
与Structure[]
兼容(类型缩小没有危险)。
我不是 100% 确定为什么直接返回不起作用,但我的假设是,在 f2()
中,您告诉编译器“这个特定数组的类型为 Structure[]
”
它说不,不是。当你在f1()
中有一个中间变量时,你说的是“这个函数返回Structure[]
”,当你返回中间变量时,编译器会检查并说“好的result
匹配Structure[]
”所以这个函数正在做它说。
我很想知道其他人是否有更严格的解释
【讨论】:
以上是关于typescript array.map 丢失返回类型的主要内容,如果未能解决你的问题,请参考以下文章
typescript 不检查 Array.map 结果的类型吗?
巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合