簡體   English   中英

如何在 Typescript 3.0 中將元組“映射”到另一個元組類型

[英]How to 'map' a Tuple to another Tuple type in Typescript 3.0

我有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 3.1 支持的映射元組類型

您可以創建具有屬性012和正確類型length的映射類型,如下所示:

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,或者作為一種解決方法,您可以編寫一個條件類型來匹配元組,只要您認為您可能擁有,例如, 像這樣.

您需要排除數組的非索引鍵,否則您還將映射pushlength等:

type NumStrDate = [number, string, Date]
type IdxOf<T extends any[]> = Exclude<keyof T, keyof any[]>
type OrUndef<T extends any[]> = {[K in IdxOf<T>]: T[K] | undefined}
type MaybeNSD = OrUndef<NumStrDate>

const fine: MaybeNSD = [5, 'foo', undefined]
const problem: MaybeNSD = ['foo', undefined, undefined]

如果您將鼠標懸停在MaybeNSD上,它將向您顯示已解決的含義:

type MaybeNSD = {
    0: number | undefined;
    1: string | undefined;
    2: Date | undefined;
}

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM