You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 TExtendedFuncs1
  • findData('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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:40:21