TypeScript数组类型疑问:非空数组定义及空数组赋值合法性
TypeScript数组类型相关问题解答
示例代码
let obj: { id_1: number; id_2: number; }[] = [];
问题
- 如何定义不允许为空的数组类型?要求数组必须包含至少一个带有
id_1和id_2数字属性的对象; - 为何将空数组赋值给上述对象数组类型时,TypeScript编译器不报错,该赋值为何合法?
问题1:定义非空数组类型
要约束数组必须包含至少一个指定类型的元素,有两种常用方式:
方式1:自定义元组+剩余元素类型
先单独定义数组元素的类型,再通过元组语法强制要求至少一个元素,剩余位置可以是任意数量的同类型元素:
// 定义单个元素的类型 type Item = { id_1: number; id_2: number; }; // 定义非空数组类型:至少1个Item,后面可以跟任意多个Item type NonEmptyItemArray = [Item, ...Item[]]; // 合法用法 let validArr: NonEmptyItemArray = [{ id_1: 1, id_2: 2 }]; let validArrWithMultiple: NonEmptyItemArray = [{ id_1: 1, id_2: 2 }, { id_1: 3, id_2: 4 }]; // 非法用法(编译器报错) let invalidEmptyArr: NonEmptyItemArray = []; // 提示:Type '[]' is not assignable to type 'NonEmptyItemArray'
方式2:使用内置只读非空数组类型
如果你的数组不需要修改,可以直接用TypeScript内置的ReadonlyNonEmptyArray类型:
let validReadonlyArr: ReadonlyNonEmptyArray<Item> = [{ id_1: 1, id_2: 2 }];
问题2:空数组赋值合法的原因
TypeScript中T[](比如你代码里的{id_1: number; id_2: number}[])代表任意长度的数组,长度可以是0。空数组[]是所有数组类型的子类型,因为它完全符合“0个元素的T类型数组”的定义,所以编译器允许这种赋值。
只有当你显式使用非空数组类型(比如上面的NonEmptyItemArray)约束变量时,空数组才会因不符合类型要求而触发报错。
内容的提问来源于stack exchange,提问作者Husain
相关产品推荐
相关产品推荐

