如何使用/声明一个不会在 Angular 11 中传递严格和 noImplicitReturns TypeScript 设置的外部模块?

Posted

技术标签:

【中文标题】如何使用/声明一个不会在 Angular 11 中传递严格和 noImplicitReturns TypeScript 设置的外部模块?【英文标题】:How to use / declare an external module, which won't pass strict and noImplicitReturns TypeScript settings in Angular 11? 【发布时间】:2021-06-23 07:07:47 【问题描述】:

我们有一个打开了strict mode 的Angular 11 应用程序。它在tsconfig.jsoncompilerOptions 配置中有这些值:

"strict": true,
"noImplicitReturns": true,

现在我们要使用外部库 (leaflet geoman)。库是这样导入的:

import * as L from 'leaflet';
import '@geoman-io/leaflet-geoman-free';

不幸的是,它包括隐式 any 类型以及隐式 any 返回类型:

参数“options”隐含地具有“any”类型。 'setLang',缺少返回类型注解,隐含了一个'any'返回类型

如何告诉编译器在编译期间忽略模块中的这些错误,但在项目的其余部分保持 strict 模式打开?

【问题讨论】:

Leaflet 和 Leaflet-geoman-free,根据 npmjs.com 包页面,已经包含了正确的类型。检查 @types 是否包含在 tsconfig 文件中 @AndrewAlhena TypeScript 实现似乎还没有准备好,请参阅:Typescript implementation #790。 【参考方案1】:

您可以调用 compiler 并使用 --skipLibCheck 标志来实现您想要的。

--skipLibCheckTypeScript 2.0 中添加:skiplibcheck

tsc --skipLibCheck

您可以在此线程中阅读有关为什么使用它的更多信息:

Usage of the TypeScript compiler argument 'skipLibCheck'

【讨论】:

【参考方案2】:

即使在leaflet 和leaflet-geoman-free npm 包中包含@types,您也​​应该能够使用“as”关键字告诉TypeScript 元素尊重某个接口/类。

const x = fn() as IYourInterface;

如果你知道返回数据的结构,你可以自己定义一个接口。如果需要,您可以通过在触发错误的行之前添加此注释来忽略打字稿触发的错误:

// @ts-ignore
line of code that triggers the error

显然,如果您确定包缺少某些类型定义,最好的方法是自己创建一个接口。

【讨论】:

以上是关于如何使用/声明一个不会在 Angular 11 中传递严格和 noImplicitReturns TypeScript 设置的外部模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TypeScript 在我的 Angular 2 组件中声明模型类?

如何在Angular 11中显示来自另一个组件的模态组件

如何在STM32 Cube IDE中使用另一个全局变量Array中声明的全局变量而不会出现任何错误?

如何在 Angular 2 / Typescript 中声明全局变量? [关闭]

Angular 11:不推荐使用订阅:改用观察者?

Angular与React我们该如何选择?