TypeScript如何逐位比对两个元组类型并修复索引访问报错
错误原因
因为T1与T2的长度没有绑定关系,T1的索引K不一定是T2的合法索引,所以TS默认不允许直接用K访问T2的元素。你之前的代码虽然运行结果符合预期,是因为类型计算时不存在的索引返回的类型与T1对应元素类型比对默认不匹配,刚好符合你要的逻辑,但语法层面确实不符合TS的类型索引规则,才会抛出错误。
修复方案
在访问T2的元素前,先判断当前索引K是否属于T2的合法索引:如果是,再做类型比对;如果不是,直接返回0即可,完全符合你预设的三条规则。
修复后的完整代码如下:
type Equals<X, Y> = [X] extends [Y] ? [Y] extends [X] ? true : false : false; type TupleElementComparison<T1 extends readonly unknown[], T2 extends readonly unknown[]> = { [K in keyof T1]: K extends keyof T2 ? Equals<T1[K], T2[K]> extends true ? 1 : 0 : 0 }
修复后所有示例的返回结果和原有预期完全一致,且不会再抛出索引错误。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

