如何泛化typeof obj[keyof typeof obj]以获取对象值联合类型?
提取对象所有值的TypeScript类型实现
当然可行,你之前的写法错误在于把EnumLike定义成了函数类型,但实际上我们需要的是一个通用类型别名来提取对象值的联合类型。
正确实现方式
首先定义通用工具类型:
type EnumLike<T> = T[keyof T];
如果需要严格约束输入为对象类型,可以添加类型限制:
type EnumLike<T extends Record<string, unknown>> = T[keyof T];
针对你的示例使用
由于你给MyBar加了as const断言,它的类型会保留字面量值的精确信息,直接通过泛型传入它的类型即可:
const MyBar = { Benchpress: 1, Squats: 2 } as const; type BarKeys = EnumLike<typeof MyBar>; // BarKeys 的类型为 1 | 2
为什么原写法不生效
你之前的代码:
type EnumLike<T extends {}> = (obj: T) => typeof obj[keyof typeof obj];
定义的是一个函数类型(接受T类型参数,返回T的值类型),并非用来提取类型的工具类型。TypeScript中没有直接"调用"类型的语法,必须通过泛型参数传递目标类型来实现类型推导。
关键注意点
如果对象没有添加as const断言,TypeScript会把值的类型自动拓宽为基础类型(比如这里会变成number),此时提取出的类型会是number而非1 | 2,所以as const是保留字面量精确类型的核心。
内容的提问来源于stack exchange,提问作者heaxyh
相关产品推荐
相关产品推荐

