TypeScript嵌套查找类型TS2536报错原因及修复方法
错误产生原因
TS2536错误的核心原因是TypeScript对映射类型中多层泛型索引的校验规则限制:
- 映射类型里的遍历键
k、j属于受约束的泛型参数,而非确定的字面量类型 - TS不会在编译映射类型时穷举所有
k、j的组合,验证X[k][j]一定存在c属性;它默认保留类型扩展的可能性——比如后续给X的任意层级新增不含c的字段时,X[k][j]['c']的访问就会非法 - 因此TS会判定未收窄的
X[k][j]无法被c索引,直接抛出错误。
正确修改方案
使用条件类型做类型收窄,明确告诉TS仅当X[k][j]存在c属性时取对应类型,这种写法完全类型安全:
type X = { a: { b: { c: string; }; }; }; type Y = { [k in keyof X]: { [j in keyof X[k]]: X[k][j] extends { c: infer C } ? C : never; }; };
上述写法得到的Y类型完全符合预期,校验结果等价于:
type Y = { a: { b: string; }; };
如果确定业务场景里X[k][j]下所有属性都必然包含c字段,也可以用类型断言快速绕开检查,但这种写法会丢失类型安全性,不推荐使用:
// 非安全写法,仅作示例 type YUnsafe = { [k in keyof X]: { [j in keyof X[k]]: (X[k][j] as { c: unknown })['c']; }; };
内容的提问来源于stack exchange,提问作者Remirror
相关产品推荐
相关产品推荐

