【问题标题】:Typescript: Is it possible to create a tuple of specified length?打字稿:是否可以创建指定长度的元组?
【发布时间】:2019-02-10 23:58:42
【问题描述】:

它应该像这样工作:

type SpecifiedLengthTuple<T, L extends number> = ???

type tupleOfThreeStrings = SpecifiedLengthTuple<string, 3> // [string, string, string]

如果有人想知道,我想用这个来解决这个问题:Typescript: increment number type

TupleUnshift 的帮助下输入here

通过检查结果(未移位)元组的['length']

【问题讨论】:

  • Not officially。您可以提出一个递归定义,甚至可以使用技巧进行编译,但实际上编译器会在一定深度(6?20?类似的东西)后停止正确检查,所以像[[],[any],[any,any],...] 这样的硬编码列表可能是最好的现在就做。
  • 嗨@jcalz 谢谢。您能否也检查this 相关问题?这是关于递归的,但我认为如果限制是 20 或其他东西就可以了。至少我想知道如何解决递归(循环引用)错误。

标签: typescript typescript-typings


【解决方案1】:

您必须使用元组 [...T]Item 定义 PrependToTuple 泛型并返回 [I, ...T]

type PrependTuple<A, T extends Array<any>> = 
  (((a: A, ...b: T) => void) extends (...a: infer I) => void ? I : [])

您可以使用递归调用,当length 等于N 时返回元组,如果不等于N,则返回带有前置项的累积元组

type SpecifiedLengthTuple<T, N extends number, L extends Array<any> = []> = {
  true: L;
  false: SpecifiedLengthTuple<T, N, PrependTuple<T, L>>;
}[L['length'] extends N ? "true" : "false"];

type Result = SpecifiedLengthTuple<boolean, 3>; // [boolean, boolean, boolean]

Playground

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2019-02-28
    • 2013-12-18
    • 2021-02-02
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2016-11-08
    相关资源
    最近更新 更多