TypeScript映射类型存在成员类型冲突,如何修复调用报错?
修复TypeScript联合类型转换函数调用的类型错误
错误原因
TypeScript无法自动关联联合类型Filters中filter.type属性与filter本身的具体类型。当调用converter[filter.type](filter)时,converter[filter.type]的类型是((filter: Filter1) => string) | ((filter: Filter2) => string),而传入的filter是Filter1 | Filter2。TypeScript会尝试计算两个函数参数的交集Filter1 & Filter2,但由于type属性的取值冲突,这个交集被简化为never,从而抛出类型不匹配的错误。
修复方案
方案一:使用switch语句+类型断言
通过switch语句明确匹配type值,同时用类型断言让TypeScript确认当前filter的具体类型:
myFilters.map((filter) => { switch (filter.type) { case 'filter1': return converter.filter1(filter as Filter1); case 'filter2': return converter.filter2(filter as Filter2); } });
方案二:用泛型函数封装调用
借助泛型让TypeScript锁定filter的具体类型,消除联合类型的模糊性:
const convertFilter = <T extends Filters>(filter: T) => { return converter[filter.type](filter); }; myFilters.map(convertFilter);
泛型T会被推断为联合类型中的单个具体类型(比如Filter1或Filter2),此时converter[filter.type]的参数类型与filter完全匹配,不会出现类型冲突。
方案三:自定义类型守卫
通过类型守卫函数明确filter的具体类型,让TypeScript在条件分支中正确推断类型:
function isFilter1(filter: Filters): filter is Filter1 { return filter.type === 'filter1'; } function isFilter2(filter: Filters): filter is Filter2 { return filter.type === 'filter2'; } myFilters.map((filter) => { if (isFilter1(filter)) { return converter.filter1(filter); } else { return converter.filter2(filter); } });
内容的提问来源于stack exchange,提问作者Dávid Molnár
相关产品推荐
相关产品推荐

