我希望在以下代码中出现类型错误,但是对于打字稿来说,完全可以,您能告诉我为什么吗?
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'
}
]
}
谢谢!
答案 0 :(得分:0)
该错误是由于您在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[]
”,因此该功能正在执行其所要求的操作。
我很想知道别人是否有更严格的解释
答案 1 :(得分:0)
我刚刚了解到Typescript具有仅用于对象文字的精确类型的概念,因此f1不使用对象文字,因此无法添加其他属性,并且该属性对Typescript有效。 f2使用对象文字,因此不允许使用其他属性。这让我很害怕,但这就是打字稿的工作原理