【问题标题】:How to 'map' a Tuple to another Tuple type in Typescript 3.0如何在 Typescript 3.0 中将元组“映射”到另一个元组类型
【发布时间】:2019-01-11 08:09:38
【问题描述】:

我有 Maybe 类型的元组:

class Maybe<T>{ }

type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];

我想把它变成一个类型的元组:

type TupleIWant = [string, number, boolean];

所以我尝试了这个:

type ExtractTypes<T> = T extends Maybe<infer MaybeTypes>[] ? MaybeTypes : never;

type TypesArray = ExtractTypes<MaybeTuple>; // string | number | boolean NOT [string, number, boolean]

这不起作用:-(

我得到 (string | number | boolean)[] 而不是我想要的元组:[string, number, boolean]

目前我想做的事情可能吗?

【问题讨论】:

    标签: typescript typescript3.0


    【解决方案1】:

    您需要使用 mapped tuple type,它在 TypeScript 3.1 中受支持。

    您可以创建一个映射类型,该类型具有正确类型的属性012length,如下所示:

    class Maybe<T> {}
    
    type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];
    
    type MaybeType<T> = T extends Maybe<infer MaybeType> ? MaybeType : never;
    type MaybeTypes<Tuple extends [...any[]]> = {
      [Index in keyof Tuple]: MaybeType<Tuple[Index]>;
    } & {length: Tuple['length']};
    
    let extractedTypes: MaybeTypes<MaybeTuple> = ['hello', 3, true];
    

    如果您使用的是较旧版本的 typescript,您可以使用未发布版本的 TypeScript,或者作为一种解决方法,您可以编写一个条件类型来匹配元组,只要您认为您可能有,例如, like this.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-27
      • 2018-08-14
      • 2016-02-10
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多