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

Typescript中两个对象值映射场景的类型定义与报错解决

问题原因
  • 首先是参数逻辑不匹配:你定义的checkValues第二个参数要求的是objA的键,类型为字面量联合"a" | "b",但你调用时传入的是objA.a,这是objA的属性值,默认推导为string类型,二者类型不匹配,直接触发Argument of type 'string' is not assignable to parameter of type '"a" | "b"'报错。
  • 其次是对象类型推导过于宽泛:默认情况下TS会把普通对象的字符串属性值推导为string类型,不会识别为固定的字面量类型,无法实现严格的取值约束。
解决方案

根据你的实际需求选择对应方案即可:

方案1:保持函数设计逻辑,修正传参方式

如果你的设计初衷就是第二个参数传objA的键,只需要给对象添加as const约束字面量类型,调用时传键名即可:

// as const 让TS将对象属性推导为只读的字面量类型,而非宽泛的string
const objA = {
  a: "a",
  b: "b"
} as const
const objB = {
  a: "a",
  b: "b"
} as const

// 第一个参数约束为objA的值的联合类型,第二个参数约束为objA的键的联合类型
const checkValues = (type: typeof objA[keyof typeof objA], key: keyof typeof objA) => {
  return objA[key] === type
}

// 调用时第二个参数传objA的键名,而非属性值
checkValues("a", "a")

方案2:调整函数参数类型,适配现有传参写法

如果你确实需要第二个参数传对象的属性值,调整函数的参数类型定义即可:

const objA = {
  a: "a",
  b: "b"
} as const
const objB = {
  a: "a",
  b: "b"
} as const

// 两个参数都约束为objA的值的联合类型
const checkValues = (type: typeof objA[keyof typeof objA], value: typeof objA[keyof typeof objA]) => {
  return value === type
}

// 现在可以正常传入objA.a作为参数
checkValues("a", objA.a)
临时解决方式

如果不需要严格的类型校验,只想快速消除报错,可以使用类型断言绕开校验,不推荐长期使用:

checkValues("A", objA.a as keyof typeof objA)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:05