我有一个清单,知道永远不会为空。可以在Typescript中定义一个永远不会为空的数组吗?
我知道像[ number, number ]
这样的元组是可能的,但是这不能用,因为我的数组可以是任意大小。
我想我要寻找的是NonEmptyArray<number>
类型。
它存在吗? :)
答案 0 :(得分:5)
是的,您可以这样定义它:
type NonEmptyArray<T> = [T, ...T[]];
const okay: NonEmptyArray<number> = [1, 2];
const alsoOkay: NonEmptyArray<number> = [1];
const err: NonEmptyArray<number> = []; // error!
这是由于TS 3.0中为rest elements in tuple types添加了支持。我不确定您的用例是什么...不过使用这种类型可能比您期望的还要烦人,
function needNonEmpty(arr: NonEmptyArray<number>) {}
function needEmpty(arr: []) {}
declare const bar: number[];
needNonEmpty(bar); // error, as expected
if (bar.length > 0) {
needNonEmpty(bar); // ugh, still error!
}
// guess I need to make a user-defined type guard
function isNonEmptyArray<T>(arr: T[]): arr is NonEmptyArray<T> {
return arr.length > 0;
}
if (isNonEmptyArray(bar)) {
needNonEmpty(bar); // okay
} else {
needEmpty(bar); // error!! urgh, do you care?
}
无论如何,希望能有所帮助。祝你好运!
答案 1 :(得分:0)
我也对此感到好奇,并提出了另一种解决方案:
type NonEmptyArray<T> = T[] & { 0: T };