尽管TypeScript编译器出错,为什么我的React Native应用仍能成功构建?


15

我最近开始在Expo中使用TypeScript。我已经完成了所有的linter / formatter集成,typescript-eslint因此我可以在编码过程中捕获大多数错误。为了检查代码是否可以编译,我不时运行npx tsc一次,并进行相应的修复。

我尚未完全掌握的一件事是,即使有许多编译错误,我的应用程序仍能成功构建的原因。我希望(并希望)针对每个编译错误都看到一个红色屏幕错误,而不是应用程序构建成功,然后我找到了它。例如,

function square<T>(x: T): T {
  console.log(x.length); // error TS2339: Property 'length' does not exist on type 'T'.
  return x * x;
}

是典型的TypeScript错误,我相信吗?在编译时可以很容易地检查该错误。我希望它导致大的红色屏幕错误,并且构建失败。

我是TypeScript的新手,所以有可能我错过了一些非常重要的内容。究竟是什么原因导致这种宽大处理,有没有办法实施更严格的检查?


“成功构建”是指仍然输出JS,还是某个时刻没有显示编译器错误消息?
ecraig12345 '19

2
我的意思是无论如何都将输出JS,并且我可以在开发模式下运行该应用程序,甚至可以毫无问题地构建生产应用程序。我本来希望TypeScript在编译时阻止这种情况。运行时总是显示编译器错误消息,npx tsc但我希望为每个TypeScript错误都显示一个红色屏幕,就像处理普通JS错误一样const n = 23; n.reverse();,这样 会导致红色屏幕显示消息“ n.reverse不是一个函数。(在'n.reverse()','n.reverse'未定义)“
anar

2
我也觉得这很奇怪。我也找不到适当的解决方案。
Simon Bengtsson

Answers:


2

首先要了解的是Typescript是Javascript的超集,在这种情况下,实际上在编译过程中不会进行类型检查。

从本质上讲,Babel只是剥离了Typescript并将其转换为Javascript,然后将其编译为js捆绑包。

您可以查看以下Babel文档的第一行以及注意事项:https : //babeljs.io/docs/en/next/babel-plugin-transform-typescript

由于Babel不进行类型检查,因此语法上正确但会失败的代码可能无法成功地转换为TypeScript类型检查,并且通常以意外或无效的方式进行转换。

我的建议是将构建命令扩展为首先包含tsc或更确切地说是Typescript编译,并noEmit在tsconfig中将其设置为true。

更新:我发现了另一个实例,其中添加时适用最近jesttypescript一个项目。在Jest文档的底部,他们实际上声明了相同的内容:

https://jestjs.io/docs/zh-CN/getting-started#using-typescript

但是,将TypeScript与Babel结合使用时有一些注意事项。由于Babel中对TypeScript的支持是编译,因此Jest在运行测试时不会进行类型检查。如果需要,可以使用ts-jest。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.