You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不会重复出现)。

一些扩展情况

这个方案对更复杂的类型也适用:

  • 包含可选属性的类型:可选属性的值类型会自动带上undefined
    type 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:40