Typescript非空數組接口與數組創建中斷

我從這個問題得到了一些定義NonEmptyArray的方法。它們大部分都在工作,但當我將其與代碼創建的數組一起使用時,我發現了一個奇怪的現象:

type NonEmptyArray<T> = T[] & { 0: T };

function myFunction(param: NonEmptyArray<number>){

}

const myArray = [1,2];

myFunction([1,2]); // OK
myFunction(myArray); // ERROR

Playground

錯誤顯示:

“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,或者我沒有看到什么。有人知道這里發生了什么嗎?

? 最佳回答:

當你說

const myArray = [1,2];

Typescript將其推斷為number[]——一個可變數組,可能有也可能沒有元素。因此myArray[0]可能是未定義的。或者,如果有一個函數將數組重置為空呢。

type NonEmptyArray<T> = T[] & { 0: T };

function myFunction(param: NonEmptyArray<number>){

}

const myArray = [1,2];

resetMyArrayEmpty(myArray) // <-- we do not know how it alters the array

myFunction([1,2]); // OK
myFunction(myArray); // ERROR

Typescript無法保證所定義的數組保持不變,因此會出現錯誤。您要么取得所有權并顯式地說類型是number[] & {0: number},要么確保數組是不可變的,如下所述:

一種方法是采用readonly數組并將數組定義為使用const斷言。像這樣:

type NonEmptyArray<T> = readonly T[] & { 0: T };

function myFunction(param: NonEmptyArray<number>){

}

const myArray = [1,2] as const;

myFunction([1,2]); // OK
myFunction(myArray); // OK

https://tsplay.dev/N7bVrw

主站蜘蛛池模板: 少妇激情AV一区二区三区| 丝袜美腿一区二区三区| 五月婷婷一区二区| 亚洲日韩AV一区二区三区中文| 色窝窝无码一区二区三区成人网站 | 国产亚洲情侣一区二区无码AV| 国产成人无码一区二区在线观看| 国精品无码一区二区三区在线 | 午夜福利一区二区三区高清视频 | 一区二区三区四区免费视频| 无码国产精品一区二区免费式直播 | 久久国产精品无码一区二区三区| 相泽南亚洲一区二区在线播放| 性色AV一区二区三区| 亚洲熟妇av一区二区三区漫画| 在线视频一区二区三区四区| 精品欧洲av无码一区二区14| 中文字幕一区二区三区乱码| 一区二区在线播放视频| 国产主播福利精品一区二区| 精品国产一区二区三区久 | 国产成人无码精品一区不卡| 中文人妻av高清一区二区| 国产麻豆媒一区一区二区三区| 精品国产一区二区三区2021| 国产伦精品一区二区三区免费下载| 中文字幕在线看视频一区二区三区 | 一区二区在线免费视频| 性色AV一区二区三区| 亚洲AV无码国产精品永久一区| 国产伦精品一区二区三区视频金莲 | 日本不卡免费新一区二区三区| 国产精品熟女一区二区| 国产一区二区精品久久凹凸| 国产一区二区电影| 日韩精品一区二区三区老鸭窝| 精品人妻无码一区二区三区蜜桃一| 无码中文字幕人妻在线一区二区三区 | 日本一区二三区好的精华液| 狠狠综合久久av一区二区| 波多野结衣AV无码久久一区|