如何定义传入指定键的泛型函数实现TS对象类型正确推导
TypeScript 转换实现
完全可以通过泛型定义满足自动推导键类型的要求,转换后的代码如下:
function generate<K extends PropertyKey>(key: K) { return { [key]: 'success', } as Record<K, string>; } const obj = generate('result'); // 此时 typeof obj 类型为 { result: string },完全符合要求
实现逻辑说明
- 定义泛型参数
K,约束其继承TS内置的PropertyKey类型(即对象合法键的联合类型:string | number | symbol)。当传入固定字符串/数字/符号值作为参数时,TS会自动将K推导为传入值的字面量类型,而非宽泛的基础类型。 - 由于TS默认对动态计算属性名的返回值会推导出
{ [x: string]: string }这类宽泛结构,因此使用Record<K, string>做安全类型断言,明确返回对象的键为传入的K类型、值为string类型。该断言完全匹配运行时的实际返回结构,不存在类型安全问题。
效果验证
传入不同键名时,TS会自动推导对应返回类型:
const idObj = generate('id'); // typeof idObj => { id: string } const numKeyObj = generate(123); // typeof numKeyObj => { 123: string }
访问不存在的键时会直接触发类型报错,符合类型安全要求。
内容的提问来源于stack exchange,提问作者Ultimacho
相关产品推荐
相关产品推荐

