TypeScript为何推断动态键为返回对象的函数?
问题分析与解决方案
错误根源
你这里的核心问题是类型断言用错了:
keyof boolean取的是布尔值类型的内置属性(比如toString、valueOf这些函数),而非你定义的对象a的键类型- 断言后类型匹配错误,取到的值是函数类型,和
checked需要的boolean | undefined类型不兼容,因此触发报错
修复方案
方案1:修正类型断言
直接把断言目标改成keyof typeof a,typeof a对应你定义的对象类型,keyof typeof a就是它的合法键类型(即"something"):
const a = { something: true }; // 修正后的代码 <Checkbox checked={a["Some Thing".toLowerCase().replace(/\s+/g, "") as keyof typeof a]} />
方案2:添加类型守卫(更安全)
如果担心字符串转换后可能不属于对象的键,可以加类型守卫做安全校验:
const a = { something: true }; const key = "Some Thing".toLowerCase().replace(/\s+/g, ""); // 类型守卫:验证key是否为a的合法键 function isKeyOfA(k: string): k is keyof typeof a { return k in a; } // 使用时判断取值 <Checkbox checked={isKeyOfA(key) ? a[key] : undefined} />
方案3:定义明确的键类型(适合复杂场景)
如果这类键转换是高频逻辑,可以先定义对象的键类型,再复用:
type AKey = "something"; const a: Record<AKey, boolean> = { something: true }; const key = "Some Thing".toLowerCase().replace(/\s+/g, "") as AKey; <Checkbox checked={a[key]} />
内容的提问来源于stack exchange,提问作者ebof1223
相关产品推荐
相关产品推荐

