如何将一个元组"映射"到Typescript 3.0中的另一个元组类型

Roa*_*ers 8 typescript typescript3.0

我有Maybe类型的元组:

class Maybe<T>{ }

type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

哪个不起作用:-(

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

我现在想做什么?

Mat*_*hen 6

您需要使用映射的元组类型,TypeScript 3.0不支持该类型,但主分支支持该类型,并将在TypeScript 3.1中发布.在3.1发布之前,您可以使用未发布的TypeScript版本,或者作为变通方法,您可以编写条件类型以匹配元组,只要您认为自己可能具有这种类型,例如,像这样.

在打字稿3.0,你可以有属性映射类型0,1以及2正确的类型,像这样的:

class Maybe<T>{}

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

type MaybeType<T> = T extends Maybe<infer MaybeType> ? MaybeType : never;
type MaybeTypes<T> = {[P in keyof T]: MaybeType<T[P]>};

let extractedTypes: MaybeTypes<MaybeTuple> = ["hello", 3, true]
Run Code Online (Sandbox Code Playgroud)

然而,如所描述这里,它不是一个真正的元组类型,而不是分配给真正的元组类型[string, number, boolean].