繁体   English   中英

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

[英]Is it possible to define a non empty array type in Typescript?

我有一个我知道永远不会为空的数字列表。 是否可以在 Typescript 中定义一个永远不会为空的数组?

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

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

它存在吗? :)

一项允许您只检查array.length > 0以防止空数组的功能请求microsoft/TypeScript#38000因过于复杂而被拒绝。 本质上,您通常不能简单地在 TypeScript 中检查length来说服编译器关于给定数字键的属性的可用性。

您可以像这样定义一个非空数组类型:

type NonEmptyArray<T> = [T, ...T[]];

const okay: NonEmptyArray<number> = [1, 2];
const alsoOkay: NonEmptyArray<number> = [1];
const err: NonEmptyArray<number> = []; // error!

这是因为在 TS 3.0 中添加了对元组类型中剩余元素的支持。 我不确定你的用例是什么......但是使用这种类型可能比你预期的更烦人:

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!
}

如果你想让length检查工作,你需要使用类似用户定义的类型保护函数的东西,但使用它仍然很烦人:

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?        
} 

无论如何希望有帮助。 祝你好运!

我也想知道这个并想出了一个不同的解决方案:

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

给快乐的读者的注意事项。 上述解决方案均不可行。

type NonEmptyArray<T> = T[] & { 0: T }
// type NonEmptyArray<T> = [T, ...T[]] -- same behavior

// ISSUE 1: map does not preserve Non-Emptiness
const ns: NonEmptyArray = [1]
const ns2 = ns.map(n => n) // number[] !!!

// ISSUE 2: length check does not make an array Non-Empty
function expectNonEmpty<T>(ts: NonEmptyArray<T>): any {}

if (ns2.length > 0) {
  expectNonEmpty(ns2) // type error
}

仅供参考,所以您知道为什么在实践中不太可能看到NonEmptyArray 上面的回复应该有提到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM