是否可以在Typescript中定义非空数组类型?

时间:2019-05-06 13:20:10

标签: typescript

我有一个清单,知道永远不会为空。可以在Typescript中定义一个永远不会为空的数组吗?

我知道像[ number, number ]这样的元组是可能的,但是这不能用,因为我的数组可以是任意大小。

我想我要寻找的是NonEmptyArray<number>类型。

它存在吗? :)

2 个答案:

答案 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 };