20

我有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]

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

4

1 回答 1

21

您需要使用 TypeScript 3.1 支持的映射元组类型

您可以创建具有正确类型的属性0、和的映射类型1,如下所示:2length

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,或者作为一种解决方法,您可以编写一个条件类型来匹配元组,只要您认为您可能拥有,例如,像这样.

于 2018-08-03T19:40:12.253 回答