TypeScript:如何从类型的值类型生成联合类型?附示例实现
如何在TypeScript中从类型的值类型生成联合类型
刚好TypeScript原生就支持这种操作,甚至不需要太复杂的自定义逻辑——如果你想封装成Magic泛型的话,一行代码就能搞定,核心是**keyof操作符和索引访问类型**的组合。
针对你的场景的实现
先看具体代码:
// 你的原始类型示例 type type1 = "foo"; type type2 = "bar" | "baz"; type A = { a: type1; b: type2; c: type2 }; // 自定义Magic泛型 type Magic<T> = T[keyof T]; // 验证结果 type Result = Magic<A>; // 类型为 type1 | type2 → 也就是 "foo" | "bar" | "baz"
为什么这能生效?
拆解一下逻辑:
keyof T:这个操作符会提取类型T所有键名的联合类型。对于你的A类型来说,keyof A就是"a" | "b" | "c"。T[keyof T]:这是索引访问类型的用法,意思是获取T中所有键对应的值类型。当你用联合类型的键去访问时,TypeScript会自动把对应的值类型合并成一个联合类型,而且会自动去重(所以b和c的type2不会重复出现)。
一些扩展情况
这个方案对更复杂的类型也适用:
- 包含可选属性的类型:可选属性的值类型会自动带上
undefinedtype B = { name: string; age?: number }; type MagicB = Magic<B>; // string | number | undefined - 带索引签名的类型:索引签名对应的类型也会被包含进来
type C = { [prop: string]: boolean; id: number }; type MagicC = Magic<C>; // boolean | number - 空对象类型:如果传入
{},Magic<T>会返回never(因为空对象没有可访问的键)type MagicEmpty = Magic<{}>; // never
内容的提问来源于stack exchange,提问作者Kirill A
相关产品推荐
相关产品推荐

