如何让TSC正确推断联合类型为对应单个类型,解决属性赋值报错
问题原因
TypeScript 目前无法自动追踪联合类型变量的不同属性之间的关联关系:你定义的Selector是联合类型,每个成员的key和getValue()返回值是一一对应的,但在循环遍历selectors时,编译器会把selector.key推导为'id' | 'title',把selector.getValue()推导为number | string | undefined,不会把两者绑定对应。
而你给Partial<AMusic>类型的m赋值时,编译器会取m所有可能属性的类型交集来做校验,Partial<AMusic>的属性类型分别是number | undefined和string | undefined,交集只有undefined,就出现了你遇到的类型报错。
解决方案
方案1:用泛型封装赋值逻辑(最安全,推荐)
通过泛型函数可以让编译器正确推断key和对应值的类型绑定,不需要额外的类型断言:
// 新增泛型赋值函数 function setField<T, K extends keyof T>(target: T, key: K, value: T[K]): void { target[key] = value } for(const selector of selectors) { // 调用泛型函数,编译器会自动匹配类型 setField(m, selector.key, selector.getValue()) }
方案2:直接使用类型断言(快速解决)
如果你确定类型一定匹配,可以直接用类型断言告诉编译器跳过校验:
for(const selector of selectors) { m[selector.key] = selector.getValue() as never } // 或者更严谨的写法 for(const selector of selectors) { const key = selector.key as keyof AMusic m[key] = selector.getValue() as Partial<AMusic>[typeof key] }
内容的提问来源于stack exchange,提问作者soonoo
相关产品推荐
相关产品推荐

