如何在 TS 中使用 noImplicityAny 和没有 allowJs 导入 JS

Posted

技术标签:

【中文标题】如何在 TS 中使用 noImplicityAny 和没有 allowJs 导入 JS【英文标题】:How to import JS in TS with noImplicityAny and without allowJs 【发布时间】:2019-09-11 16:26:54 【问题描述】:

我正在使用 Webpack 和 @babel/typescript 编译一个混合的 TypeScript 和 javascript 项目。

我使用--noImplicitAny 来鼓励利用打字。

我没有使用 --allowJs,因为我的项目太大以至于它阻塞了 TypeScript 编译器,并且它破坏了 Visual Studio 突出显示/Intellisense。

对于非类型化的 npm 模块,如果我没有时间添加类型,我会创建一个定义文件以将其类型显式设置为 any。例如

example.ts

import * as elemDataset from 'elem-dataset';

elem-dataset.ts

declare module 'elem-dataset';

这满足编译器。但是对于内部模块我还没有转换成 TS...

import * as example from './example2';  // Where example2 is example2.ts

我得到这个错误:

找不到模块“./example2”的类型声明文件。 C:/blah/blah/blah/example2.js 隐含“任何”类型。

我尝试添加类型声明,例如在this answer 中。

example2.d.ts

declare var example2: any;

declare module "example2" 
    export = example2;

然后我得到这个错误:

文件 C:/blah/blah/blah/example2.d.ts 不是模块。

我也尝试过declare module '*'; per this answer,但我遇到了与上述相同的错误。

如何将内部 JS 文件的导入类型显式设置为 any?

【问题讨论】:

【参考方案1】:

事实证明这足以满足我的需求:

// @ts-ignore
import * as x from './example2';

一开始我没有尝试,因为我认为该注释会禁用整个文件的类型检查。

但是在导入之前使用@ts-ignore 可以让我对项目的其余部分强制执行类型检查,同时忽略单个 JavaScript 文件,直到我有时间转换它。

【讨论】:

以上是关于如何在 TS 中使用 noImplicityAny 和没有 allowJs 导入 JS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用在 .d.ts 文件中定义类型的模块?

如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?

如何使用 TS 在 Angular 4 中打印页面

如何配置 IntelliJ / WebStorm 在 *.TS、*.JS 文件中的代码完成中使用单引号

如何在没有参考路径的 angularjs 应用程序中使用打字稿定义文件(.d.ts)?

如何使用基于 ts 的新样式方法在 spfx webpart 中获取当前主题