如何使用/声明一个外部模块,该模块不会在 Angular 11 中通过 strict 和 noImplicitReturns TypeScript 设置?

问题描述

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

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

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

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

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

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

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

解决方法

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

--skipLibCheck 添加在 TypeScript 2.0 中:skiplibcheck

tsc --skipLibCheck

您可以在此线程中阅读有关为什么要使用它的更多信息:Usage of the TypeScript compiler argument 'skipLibCheck'

,

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

const x = fn() as IYourInterface;

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

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

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