Typescript 限制最大数组长度

Jan*_*utz 14 javascript arrays typescript

基本上我想要一个最大长度为 4 的数组类型。很容易我无法找到如何在打字稿中实现此检查。有人可以帮我吗?像这样的东西:

const a = [item1, item2, item3, item4, *item5*] -> array has a maximum length of 4
Run Code Online (Sandbox Code Playgroud)

谢谢!

jca*_*alz 20

TypeScript 有称为tuples 的“固定长度”数组类型。您可以使用可选的元组元素来表示长度在最大 4 范围内的数组。如果您想尝试保持长度限制,我建议使用readonly元组:

type ArrayOfMaxLength4 = readonly [any?, any?, any?, any?];

const a: ArrayOfMaxLength4 = [item1, item2, item3, item4, item5]; // error!
//    ~ <--  Source has 5 element(s) but target allows only 4
const b: ArrayOfMaxLength4 = [item1, item2, item3]; // okay
Run Code Online (Sandbox Code Playgroud)

我将“固定长度”放在引号中,因为元组由特殊类型的 表示并键入Array,它具有类似的方法push()可以更改长度。没有什么可以阻止您将push值添加到元组的末尾。

const c: [number, string] = [1, "a"];
c.push(2); // oops
c.unshift("OOPS"); // big oops, totally wrong value in tuple
console.log(c); // ["OOPS", 1, "a", 2]
Run Code Online (Sandbox Code Playgroud)

有人在microsoft/TypeScript#6325请求阻止这种情况发生,但遭到拒绝。使违反约束变得更加困难的一种方法是使用 aReadonlyArrayreadonly元组,它不会公开任何方法来让您改变数组。如果您想在不更改数组长度或元素类型的情况下修改元素,这可能会太过分,但它至少会警告您以下内容push()

b.push(5); // error
//~~~~ <-- Property 'push' does not exist on type 'ArrayOfMaxLength4'
Run Code Online (Sandbox Code Playgroud)

Playground 代码链接