TypeScript值检查出现TS2367错误的异常问题及修复方法
问题:TypeScript中TS2367错误的修复方案
我定义了如下TypeScript类Vector3:
class Vector3 { //-----PUBLIC VARS x: number; y: number; z: number; //-----CONSTRUCTORS constructor(x?: number, y?: number, z?: number) { this.x = x == undefined ? 0 : x; this.y = y == undefined ? 0 : y; this.z = z == undefined ? 0 : z; } //-----METHODS SetValues(x: number, y: number, z: number): void { this.x = x; this.y = y; this.z = z; } }
随后编写了单元测试函数TestVector3:
function TestVector3() { var lhs = new Vector3(1, 2, 3); lhs.SetValues(1, 2, 3); if (lhs.x != 2 || lhs.y != 6 || lhs.z != 12) { throw "a"; } lhs.SetValues(-1, 2, 3); if (lhs.x != -1 || lhs.y != -2 || lhs.z != -3) { throw "b"; } }
执行时在lhs.x != -1处出现TS2367错误,移除throw "a";语句后错误消失,请问该如何修复这个问题?
错误原因分析
TS2367是TypeScript的条件总是为真/假编译错误,本质是代码存在不可达分支:
- 调用
lhs.SetValues(1,2,3)后,lhs.x必然是1,lhs.y是2,lhs.z是3 - 第一个
if判断lhs.x !=2 || lhs.y !=6 || lhs.z !=12的结果永远为true,throw "a"一定会执行 - TypeScript静态分析会判定
throw "a"之后的所有代码都是不可达的,因此后续的lhs.x != -1被认为是无意义的逻辑,从而抛出TS2367错误
修复方案
方案1:修正测试用例的预期值(推荐)
根据SetValues的实际逻辑(直接赋值传入参数),修正第一个if的判断条件,让测试逻辑合理,确保后续代码可达:
function TestVector3() { var lhs = new Vector3(1, 2, 3); lhs.SetValues(1, 2, 3); // 修正预期值为SetValues传入的参数 if (lhs.x != 1 || lhs.y != 2 || lhs.z != 3) { throw "a"; } lhs.SetValues(-1, 2, 3); if (lhs.x != -1 || lhs.y != 2 || lhs.z != 3) { throw "b"; } }
方案2:忽略不可达代码错误(不推荐)
如果是故意编写的失败测试用例,可以通过// @ts-ignore注释临时忽略错误,但这会掩盖潜在逻辑问题,不建议在正式代码中使用:
function TestVector3() { var lhs = new Vector3(1, 2, 3); lhs.SetValues(1, 2, 3); if (lhs.x != 2 || lhs.y != 6 || lhs.z != 12) { throw "a"; } // @ts-ignore 忽略不可达代码错误 lhs.SetValues(-1, 2, 3); // @ts-ignore if (lhs.x != -1 || lhs.y != -2 || lhs.z != -3) { throw "b"; } }
方案3:使用测试框架的断言方法
改用专业测试框架(如Jest、Mocha)的断言API,TypeScript能更好地识别测试逻辑,避免不可达代码误判:
import assert from 'assert'; function TestVector3() { var lhs = new Vector3(1, 2, 3); lhs.SetValues(1, 2, 3); assert.strictEqual(lhs.x, 1); assert.strictEqual(lhs.y, 2); assert.strictEqual(lhs.z, 3); lhs.SetValues(-1, 2, 3); assert.strictEqual(lhs.x, -1); assert.strictEqual(lhs.y, 2); assert.strictEqual(lhs.z, 3); }
内容的提问来源于stack exchange,提问作者laoguang
相关产品推荐
相关产品推荐

