簡體   English   中英

如何在TypeScript中將映射的泛型類型轉換為元組的並集

[英]How to convert a mapped generic type to an union of tuples in typescript

我正在創建類似於Object.entries東西,我希望它被更強地鍵入。 我想創建一個給定對象返回該對象屬性的2元組的強類型聯合的類型。

目前

export type Entries<T> = [keyof T, T[keyof T]][];

Entries<{first: number, second: string}> = ["first" | "second", number | string][]

我想要什么

Entries<{first: number, second: string}> = ["first", number] | ["second", string][]

您應該使用帶有{[K in keyof T]: ...}語法的實際映射類型 ,然后查找其屬性:

export type Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])[]

您還可以使用像這樣的分布式條件類型 ,它需要一個輔助類型別名才能工作:

type EntriesHelper<T, K> = K extends keyof T ? [K, T[K]] : never;
type Entries<T> = Array<EntriesHelper<T, keyof T>>;

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])

或像這樣在條件類型中使用推斷而不是幫助器的對象:

type Entries<T> = Array<
  keyof T extends infer K ? (K extends keyof T ? [K, T[K]] : never) : never
>;

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])[]

它們在這里都產生相同的輸出,但是面對可選屬性或其他邊緣情況時,它們的行為可能有所不同,因此請小心。 希望能有所幫助; 祝好運!

鏈接到代碼

暫無
暫無

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

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