如何将require转换为第三方库的import语句?

k0p*_*kus 2 typescript tslint

在我的打字稿项目中,我使用:

const program = require('commander');
const figlet = require('figlet');
const AWS = require('aws-sdk');
Run Code Online (Sandbox Code Playgroud)

并且我想重构这些行以使其工作import,以遵守 tslint 的no-var-requires规则。然而,它应该工作的方式让我望而却步。

对于 figlet,我都尝试了:

import figlet from 'figlet';
import * as figlet from 'figlet';
Run Code Online (Sandbox Code Playgroud)

然后我得到:

 bin/console.ts(1,20): error TS2307: Cannot find module 'figlet'.
Run Code Online (Sandbox Code Playgroud)

我该如何导入这些库?

Tim*_*rry 5

关键是 TypeScript 必须能够找到您所引用的模块,以便它可以对您的使用情况进行类型检查。如果没有更多信息,很难知道如何在项目中准确执行此操作,但通常答案是为您感兴趣的 JavaScript 库安装类型定义。

如果您没有现有的基础设施,最简单的方法通常是 npm。例如,对于 aws-sdk,如果您运行npm install --save @types/aws-sdk,则类型定义将被下载到node_modules/@types/aws-sdk您的项目内部,并且 TypeScript 编译器将自动在那里找到它们,因此,如果您导入 aws-sdk,它就会知道发生了什么。

指挥官也同样适用。Figlet 不过似乎没有任何已发布的声明文件,因此您必须整理自己的声明文件。您可以实际描述类型,也可以显式为模块指定类型any

  • 描述类型比较复杂,但却是理解这一切如何工作的好方法。尝试阅读手册中的类型声明部分。查看其他现有的类型定义(其中大多数都在DefinelyTyped存储库中)是解决此问题的另一种好方法。

  • 显式地给出any类型并忽略问题会容易得多,但在使用Figlet 时您不会获得任何类型系统支持。不过,有一个简写可以实现这一点:figlet.d.ts在项目中创建一个文件,然后在其中放入declare module "figlet";. 这是一个速记环境模块,应该足以让您成功导入Figlet。

请查看手册中的消耗声明文件模块解析以获取更多详细信息。


can*_*ero 5

蒂姆的回答是完美的,错误是因为导入一些打字稿需要它的类型定义(目标 package.json 中的属性“类型”指向带有模块描述的 .d.ts 文件。

你也可以试试这个:import figlet = require('figlet')在 tsconfig.json compilerOptions.esModuleInterop === true

关于等效性,这让我开始:

  • import * as foo from 'foo';相当于const foo = require('foo')(foo正在做module.exports = foo
  • import {bar} from 'foo'等价于const bar = require('foo').bar(foo 正在做module.exports = {bar}

希望能帮助到你