javascript - 你可以在 Typescript 中声明一个特定长度的数组类型吗?
问题描述
这可以写得更紧凑吗?
export type Type =
[number] |
[number, number] |
[number, number, number] |
[number, number, number, number];
就像是
export type Type = number[1, 4];
解决方案
您可以通过使用带有可选元素的元组使其更紧凑:
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 非专家来说更容易理解。
推荐阅读
- eclipse - struts2 项目中与 struts2 核心 jar 相关的错误
- git - 提交文件“somefile.txt”但未添加到项目中是什么意思?
- hadoop - 没有分区的 Hive 复制模式或删除分区
- tfs - 向 TFS 2017 中的错误工作项添加新的“选项卡”
- if-statement - Google Scripts to Telegram - 比较字符串时出现 if 语句问题
- r - R数据帧的交叉比较
- python - 熊猫 Series.value_counts() 的奇怪行为
- python - 如何在pyspark中运行指数加权移动平均线
- apache - 如果一台主机大量处理,则混在多台主机上
- angular - Angular 5:从html调用方法