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

时间:2019-10-18 23:30:21

标签: reactjs typescript react-native expo

我最近开始将TypeScript与Expo一起使用。我已经完成了typescript-eslint之类的所有linter / formatter集成,因此我可以在编码过程中捕获大多数错误。为了检查代码是否编译,我不时运行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的新手,所以有可能我错过了一些非常重要的内容。究竟是什么原因导致这种宽大处理,有没有办法实施更严格的检查?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

这个问题的直接答案是:Babel,在编译之前去掉所有打字稿标记。因此,您不会在 cli 中看到它出错。