[英]typescript array.map lost returned type
我可能會在以下代碼中遇到類型錯誤,但是對於打字稿來說完全可以,您能告訴我為什么嗎?
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'
}
]
}
謝謝!
該錯誤是由於您在f2()
中直接返回結果這一事實造成的。
如果將f2()
更改為
export function f2(): Structure[] {
const returnVal = [
{
aaa: 'sdf',
ADDITIONAL_FIELD: 'asdf'
}
]
return returnVal;
}
那么就不會有編譯器錯誤。
TypeScript使用結構化類型確定類型兼容性,因此在f1()
代碼中, result
為類型
{
aaa: string,
ADDITIONAL_FIELD: string
}[]
與Structure[]
兼容(類型變窄沒有危險)。
我不確定100%為什么直接返回不起作用,但是我的假設是在f2()
您告訴編譯器“此特定數組的類型為Structure[]
”,並且說不,不是。 當您在f1()
有一個中間變量時,您將說“此函數返回Structure[]
”,而當您返回中間變量時,編譯器將檢查並說“好的result
與Structure[]
匹配”,因此此函數將按照其說明進行操作。
我很想知道其他人是否有更嚴格的解釋
我只是了解到Typescript具有僅用於對象文字的精確類型的概念,因此f1不使用對象文字,因此無法添加其他屬性,並且對typescript有效。 f2使用對象文字,因此不允許使用其他屬性。 這讓我很害怕,但這就是打字稿的工作方式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.