[英]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 支持的映射元組類型。
您可以創建具有屬性0
、 1
、 2
和正確類型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,或者作為一種解決方法,您可以編寫一個條件類型來匹配元組,只要您認為您可能擁有,例如, 像這樣.
您需要排除數組的非索引鍵,否則您還將映射push
、 length
等:
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.