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])[]
它们在这里都产生相同的输出,但在面对可选属性或其他极端情况时可能会有所不同,所以要小心。希望有帮助;祝你好运!
推荐阅读
- c++ - 通过 WebRTC 发送已编码的帧
- r - 如何使用 for 循环对具有不同程度程度的不同多项式回归模型的结果执行 ANOVA
- php - 如何在 PHP 代码中不进行无限循环重定向?
- java - Java - 将原始电子邮件内容文本 RFC 822 转换为 MimeMessage
- c# - 在asp.net核心中,空字符串是否转换为NULL?
- javascript - HTML onclick="" 不适用于单选按钮
- windows - 打开刚刚由用户输入的批处理脚本创建的文件夹
- expression - Gnuplot:使用表达式从文件中绘制数据失败
- javascript - 即使我已经使用了 charset = UTF-8,如何解决重音问题?
- vue.js - 为每个玩笑测试重置 Vue?