TypeScript技术问题:索引工厂返回含额外属性对象的类型报错排查
TypeScript类型推导错误:objKey未正确关联对应函数的返回类型
你遇到的核心问题是findData函数无法根据传入的key值,窄化返回的Conditional联合类型成员。当前Conditional是一个联合类型,包含{name: 'extendedFuncs1', objKey: keyof TExtendedFuncs1}和{name: 'extendedFuncs2', objKey: keyof TExtendedFuncs2},但findData('extendedFuncs1')返回的类型依然是整个Conditional联合,而非仅对应extendedFuncs1的成员,导致objKey被推断为keyof TExtendedFuncs1 | keyof TExtendedFuncs2(包含additionalFunc1),用这个去索引extendedFuncs2()的返回值时,就会触发不存在属性的报错。
解决方案:让findData成为泛型函数,实现类型窄化
将findData改为泛型函数,让TypeScript能根据传入的key,推断出对应的Conditional成员类型,从而正确约束objKey的范围:
const testFunc = (data: Conditional[]) => { // 泛型函数,K约束为keyof TFuncsTypes const findData = <K extends keyof TFuncsTypes>(key: K) => data.find((d): d is Extract<Conditional, {name: K}> => d.name === key); const res1 = extendedFuncs1()[findData('extendedFuncs1')!.objKey] const res2 = extendedFuncs2()[findData('extendedFuncs2')!.objKey] return {res1, res2} }
关键说明:
- 泛型参数
K限定为keyof TFuncsTypes,确保传入的key只能是extendedFuncs1或extendedFuncs2。 - 返回值用
Extract<Conditional, {name: K}>做类型断言,明确告诉TypeScript:找到的元素是联合类型中name等于K的那个成员,而非整个联合。
修改后TypeScript就能准确推断:
findData('extendedFuncs1')!.objKey的类型是keyof TExtendedFuncs1findData('extendedFuncs2')!.objKey的类型是keyof TExtendedFuncs2
自然不会再出现additionalFunc1不存在的报错。
可选优化:简化Conditional类型定义
你可以将Conditional类型改为更直观的映射形式,效果和原定义一致,但可读性更强:
type Conditional = { [K in keyof TFuncsTypes]: { name: K; objKey: TFuncsTypes[K] } }[keyof TFuncsTypes]
这个定义直接基于TFuncsTypes的键,生成每个键对应的对象类型,最终组成联合类型,无需和TOtherTypes交叉(如果TOtherTypes不需要参与逻辑,可以直接移除)。
内容的提问来源于stack exchange,提问作者Echo
相关产品推荐
相关产品推荐

