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

如何为TypeScript函数makeObject编写签名以实现精准类型推断?

当然可以实现!

在TypeScript 3.9+版本中,你完全能达成让obj类型被精准推断为{"name": string}的需求,而且写法比你想象的更简洁。核心思路是利用泛型约束和TypeScript的自动类型推断能力,直接给makeObject定义合适的泛型签名即可,甚至不需要单独的makeKey函数。

实现代码示例

function makeObject<Key extends string, Value>(key: Key, value: Value): { [K in Key]: Value } {
  // 类型断言用于让TS认可动态属性的返回类型与泛型定义匹配
  return { [key]: value } as { [K in Key]: Value };
}

// 测试验证
const obj = makeObject("name", "Tom");
// 此时TS会准确推断obj的类型为 { name: string }

代码细节解释

  • 泛型Key extends string:这个约束告诉TypeScript,key参数的类型是具体的字符串字面量(比如"name"),而非宽泛的string类型,这样TS就能精准捕获传入的键名。
  • 泛型Value:自动捕获传入value参数的类型(比如这里的"Tom"对应string类型)。
  • 返回类型{ [K in Key]: Value }:这是一个映射类型,会动态生成仅包含Key这个属性、属性类型为Value的对象类型,完美匹配你的需求。

简化写法(用内置Record工具类型)

如果你觉得映射类型写起来繁琐,也可以用TypeScript内置的Record工具类型替代,效果完全一致:

function makeObject<Key extends string, Value>(key: Key, value: Value): Record<Key, Value> {
  return { [key]: value } as Record<Key, Value>;
}

额外补充

你之前写的makeKey函数已经验证了TS对字符串字面量类型的推断能力,而上面的写法直接把这个逻辑整合到了makeObject中,不需要额外函数处理键名——TS3.9+的泛型推断能力已经足够支撑这种场景。

内容的提问来源于stack exchange,提问作者user2263704

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:52:42