首页 > 解决方案 > 你可以在 Typescript 中声明一个特定长度的数组类型吗?

问题描述

这可以写得更紧凑吗?

export type Type = 
  [number] | 
  [number, number] | 
  [number, number, number] | 
  [number, number, number, number];

就像是

export type Type = number[1, 4];

标签: javascripttypescript

解决方案


您可以通过使用带有可选元素的元组使其更紧凑:

type OneToFourNumbers = [number, number?, number?, number?]
type Len = OneToFourNumbers["length"] // 1 | 2 | 3 | 4

这与您的 100% 不同Type,因为它接受undefined元素(至少在合并microsoft/TypeScript#43947 之类的东西之前),但它相当接近。


如果您想以编程方式执行此操作并且不打算使用超过 20 个元素的元组,则可以在可变元组上使用递归条件类型

type TupleLength<V, F extends number, T extends number, O extends any[] = []>
  = F extends O['length'] ? (
    T extends O['length'] ? O : TupleLength<V, F, T, O | [...O, V]>
  ) : TupleLength<V, F, T, [...O, V]>

type Type = TupleLength<number, 1, 4>;
/* type Type = [number] | [number, number] |
[number, number, number] | [number, number, number, number] */

当然,如果您将TupleLength其视为隐藏在某个库中的实用程序类型,这只会“更紧凑”;如果您只打算使用一次,手动版本会更好。即使您使用了几次,您可能仍想使用手动版本,因为它对于 TypeScript 非专家来说更容易理解。

Playground 代码链接


推荐阅读