我有一个清单,我知道永远不会为空。是否可以在Typescript中定义一个永远不会为空的数组?
我知道像[ number, number ]这样的元组是可能的,但这将无法工作,因为我的数组可以是任何大小。
我想我要找的是一种NonEmptyArray<number>类型。
是否存在?:)
And*_* II 23
我也想知道这个并想出了一个不同的解决方案:
type NonEmptyArray<T> = T[] & { 0: T };
Run Code Online (Sandbox Code Playgroud)
jca*_*alz 16
是的,您可以这样定义它:
type NonEmptyArray<T> = [T, ...T[]];
const okay: NonEmptyArray<number> = [1, 2];
const alsoOkay: NonEmptyArray<number> = [1];
const err: NonEmptyArray<number> = []; // error!
Run Code Online (Sandbox Code Playgroud)
这是由于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!
}
// 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?
}
Run Code Online (Sandbox Code Playgroud)
无论如何希望能有所帮助。祝好运!
Iva*_*nin 12
给快乐读者的注释。上述解决方案均不可行。
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
}
Run Code Online (Sandbox Code Playgroud)
仅供参考,所以您知道为什么在实践中不太可能看到NonEmptyArray。上面的回复应该都提到了这一点。
虽然类型[T, ...T[]]涵盖了大多数情况,但它不接受像[...anotherArray, 'element']. 我个人使用如下所示的类型来涵盖更广泛的情况:
export type NonEmptyArray<T> = [T, ...T[]] | [...T[], T] | [T, ...T[], T];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1114 次 |
| 最近记录: |