TypeScript 编译器参数“skipLibCheck”的使用

问题描述 投票:0回答:2

我一直在研究对 skipLibCheck TypeScript 编译器参数的进一步解释,以确定将此设置为 true 的安全性。我找到的最深入的解释如下:

新--skipLibCheck TypeScript 2.0 添加了一个新的 --skipLibCheck 编译器选项,该选项会导致跳过声明文件(扩展名为 .d.ts 的文件)的类型检查。当程序包含大型声明文件时,编译器会花费大量时间对已知不包含错误的声明进行类型检查,并且通过跳过声明文件类型检查可能会显着缩短编译时间。

由于一个文件中的声明可能会影响其他文件中的类型检查,因此指定 --skipLibCheck 时可能无法检测到某些错误。例如,如果非声明文件扩充了声明文件中声明的类型,则可能会导致仅在检查声明文件时报告的错误。然而,实际上这种情况很少见。

我知道您显然可以从编译器中获得性能优势,而不必键入被认为不包含错误的检查文件,但我已经看到此标志用于绕过编译器发出的与声明文件相关的错误有问题。

使用此标志来解决这个问题肯定会降低应用程序键入的完整性吗?

typescript typescript-typings typescript2.0
2个回答
124
投票

简单地解释一下这个问题:

[启用skipLibCheck]肯定会降低应用程序输入的完整性吗?

我同意,是的,确实如此。但是,如果替代方案是一个无法编译的应用程序,那么它就成为一个方便的标志。

虽然 Typescript 本身已经相当成熟,但 Typescript 社区仍然相对年轻。有大量库可用的类型定义,甚至一些本机打字稿库,但它们可能由于多种原因而彼此不兼容。

您可能会导入一个库,其类型是使用比您想要的不太严格的 tsconfig 构建的 - 当您尝试使用它时,您的编译器可能会抱怨。

您可能会发现两个库定义了相同的类型,但不兼容。我导入了一些库,它们为

Buffer
的 Polyfill 提供了自己的类型,但由于它们不兼容,我的整个应用程序将无法编译。

启用

--skipLibCheck
可以帮助解决这些问题。打开它会阻止 Typescript 对整个导入的库进行类型检查。相反,Typescript 只会针对这些类型对您使用的代码进行类型检查。这意味着只要您不使用导入库的不兼容部分,它们就能正常编译。

tl;dr,是的,

--skipLibCheck
会降低类型检查的性能,理想情况下我们不会使用它。但并非每个库都提供完美的类型,因此跳过它可能会很好。


0
投票

虽然一些库(你好,Tensorflow.js!)官方建议将

skipLibCheck
设置为 true,但还有一个隐藏的缺点。它不仅会告诉编译器跳过您无法控制的代码(即node_modules)中的
d.ts
类型检查,而且还会跳过所有
d.ts
文件

因此,如果您使用

d.ts
作为声明文件,目前无法单独对它们进行类型检查(开放问题 - https://github.com/microsoft/TypeScript/issues/30511)。我最终将
<name>.d.ts
转换为
<name>.types.ts
,这在很多方面都不是最佳的,但至少在我自己的代码中提供了类型安全,同时保持接口和实现的分离。

© www.soinside.com 2019 - 2024. All rights reserved.