You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript数组类型疑问:非空数组定义及空数组赋值合法性

TypeScript数组类型相关问题解答

示例代码

let obj: {
    id_1: number;
    id_2: number;
}[] = [];

问题

  1. 如何定义不允许为空的数组类型?要求数组必须包含至少一个带有id_1和id_2数字属性的对象;
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:31:04