You need to enable JavaScript to run this app. TypeScript 如何基于对象键推导对应值的类型?
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript 如何基于对象键推导对应值的类型?

基于键值联动定义对象值类型的实现方案

原写法不合法的原因

普通对象的字符串索引签名存在天然限制:[Arg: string]仅用于统一描述所有字符串键的通用值类型,该位置的Arg只是索引规则的占位符,无法在同对象的值类型中捕获、引用每个键的具体字符串值——它不是绑定在单组键值对上的泛型,因此没法实现“键和对应函数参数类型绑定”的效果。

实现方式:使用映射类型

TypeScript 的映射类型会逐迭代遍历指定的键集合,每轮迭代都会把当前的具体键值绑定为泛型变量,天然支持键和对应值的类型联动,对应实现如下:

type Config<KeyCollection extends string = string> = {
  [CurrentKey in KeyCollection]: (arg: `Test-${CurrentKey}`) => void
}

实际使用示例

  • 当需要限定合法键的范围时,可传入具体的键联合类型,TS会自动为每个键匹配对应的函数参数类型约束:
// 限定Config的合法键仅为 'user' | 'goods' | 'order'
type AppConfig = Config<'user' | 'goods' | 'order'>

const demoConfig: AppConfig = {
  // 键为'user'时,入参自动约束为 'Test-user' 字面量类型
  user: (arg) => {
    // TS自动推导 arg 类型为 'Test-user'
    console.log(arg)
  },
  // 键为'goods'时,入参自动约束为 'Test-goods' 字面量类型
  goods: (arg) => {
    // TS自动推导 arg 类型为 'Test-goods'
  },
  // 键为'order'时,入参自动约束为 'Test-order' 字面量类型
  order: (arg) => {
    // TS自动推导 arg 类型为 'Test-order'
  }
}
  • 当不需要限制具体键的取值范围、允许任意字符串作为键时,直接传入string作为泛型参数即可,生成的类型完全覆盖初始需求。

约束效果验证

如果函数入参类型和当前键的规则不匹配,TS会直接抛出类型错误:

const invalidConfig: AppConfig = {
  // 类型报错:键为user时,入参必须为'Test-user' 字面量
  user: (arg: 'Test-wrong') => {}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 19:15:05