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