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
相关产品推荐
相关产品推荐

