[英]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.