为什么我的 React Native 应用程序在 TypeScript 编译器出错的情况下仍成功构建?



我最近开始使用 TypeScript 和 Expo。我已经完成了所有的 linter/格式化程序集成,例如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 很陌生,所以我可能错过了一些非常重要的东西。究竟是什么导致了这种宽大处理,有没有办法执行更严格的检查?

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

本质上,Babel 只是去掉 Typescript 并将其转换为 Javascript,然后将其编译到 js bundle 中。

您可以查看以下 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。

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

相关内容

最新更新