首页 > 解决方案 > 如何将映射的泛型类型转换为打字稿中的元组联合

问题描述

我正在创建类似的东西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][]

标签: typescripttemplatesgenerics

解决方案


您应该使用具有语法的实际映射类型{[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])[]

它们在这里都产生相同的输出,但在面对可选属性或其他极端情况时可能会有所不同,所以要小心。希望有帮助;祝你好运!

链接到代码


推荐阅读