我從這個問題得到了一些定義NonEmptyArray
的方法。它們大部分都在工作,但當我將其與代碼創建的數組一起使用時,我發現了一個奇怪的現象:
type NonEmptyArray<T> = T[] & { 0: T };
function myFunction(param: NonEmptyArray<number>){
}
const myArray = [1,2];
myFunction([1,2]); // OK
myFunction(myArray); // ERROR
錯誤顯示:
“number[]”類型的參數不能賦給“NonEmptyArray”類型的參數。類型“number[]”中缺少屬性“0”,但類型“{0:number;}'.(2345”中需要屬性“0”)
如果我硬定義類型,那么錯誤就消失了:
type NonEmptyArray<T> = T[] & { 0: T };
function myFunction(param: NonEmptyArray<number>){
}
const myArray: number[] & {0: number} = [1, 2];
myFunction([1,2]); // OK
myFunction(myArray); // Also OK
我不確定這是類型定義中的bug還是typescript中的bug,或者我沒有看到什么。有人知道這里發生了什么嗎?
當你說
Typescript將其推斷為
number[]
——一個可變數組,可能有也可能沒有元素。因此myArray[0]
可能是未定義的。或者,如果有一個函數將數組重置為空呢。Typescript無法保證所定義的數組保持不變,因此會出現錯誤。您要么取得所有權并顯式地說類型是
number[] & {0: number}
,要么確保數組是不可變的,如下所述:一種方法是采用
readonly
數組并將數組定義為使用const斷言。像這樣:https://tsplay.dev/N7bVrw