Differences in Usage Between @ts-ignore and @ts-expect-error

@ts-ignore 与 @ts-expect-error 的使用时机差异

前言

近期在替项目做大型重构,其中就有将技术转换为 TypeScript 与 Monorepo,途中一些还没有头绪如何解决的类型问题,就会使用 @ts-ignore@ts-expect-error 来先行忽略,但这两者的使用时机有所不同,这篇文章就来谈谈这两者的差异。

@ts-ignore

只要在注释中撰写 @ts-ignore TypeScript 就会忽略下一行的类型检查,通常是因为该行的类型检查会报错,但我们确定该行的代码是正确的,所以就可以使用 @ts-ignore 来忽略类型检查。

// @ts-ignore 一些描述可以撰写于此
const foo: number = 'Hello World';

由于将字符串指定给数字所以在静态检查时 TS 会报错,于是我们通过 @ts-ignore 来忽略该行的类型检查。

@ts-expect-error

@ts-expect-error 与前者功能一致,但差别在于可以确定下一行代码会报错,如果该行的代码没有报错,则会报错

// @ts-expect-error 一些描述可以撰写于此
const bar: number = 'Hello World';

上面的代码会报错,因为我们将字符串指定给数字,但我们确定这样是错误的,所以就可以使用 @ts-expect-error 来确保该行的代码会报错。

结论

@ts-ignore 是用来忽略某一行的类型检查,而 @ts-expect-error 是用来确保某一行的代码会报错再忽略,这两者的使用时机有所不同,

@ts-expect-error 是 TypeScript 于 3.9 版本添加的新功能,大多时候我会偏好更积极检测问题的 @ts-expect-error,并且坚持撰写忽略错误的原因,避免忽略到其他问题

  • 选择 @ts-ignore 的情况:

    • 真的没有时间决定哪个选项更合适。
    • 项目规模较大,且新出现的错误在代码中没有明确的负责人。
    • 正在进行 TypeScript 两个不同版本之间的升级,且某行代码在一个版本中报错而在另一个版本中不报错。
  • 选择 @ts-expect-error 的情况:

    • 正在编写测试代码,实际上希望类型系统对某个操作报错。
    • 预期问题会很快得到解决,因此只需要一个临时的解决方案。
    • 项目规模适中,且团队积极主动,会在受影响的代码恢复有效后尽快移除抑制注释。

延伸阅读