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

时间:2016-11-28 09:39:03

标签: typescript tslint

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

const program = require('commander');
const figlet = require('figlet');
const AWS = require('aws-sdk');

我希望通过import重构这些行,以便遵守tslint的no-var-requires规则。然而它应该工作的方式使我望而却步。

对于figlet,我试过了两个:

import figlet from 'figlet';
import * as figlet from 'figlet';

然后我得到:

 bin/console.ts(1,20): error TS2307: Cannot find module 'figlet'.

我想如何导入这些库?

2 个答案:

答案 0 :(得分:1)

关键是TypeScript必须能够找到您所指的模块,因此它可以输入检查您的使用情况。如果没有更多信息,很难知道在项目中如何做到这一点,但通常答案是为您感兴趣的JavaScript库安装类型定义。

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

同样适用于指挥官。虽然Figlet似乎没有任何已发布的声明文件,但您必须将自己的声明文件放在一起。您既可以实际描述类型,也可以明确地为模块提供any类型:

  • 描述类型更复杂,但是了解这一切是如何工作的好方法。尝试阅读手册中的type declarations section。看看其他现有的类型定义(大多数都在DefinitelyTyped repo中)是另一种掌握这种定义的好方法。

  • 明确地给它any类型并忽略该问题会更容易,但是在使用figlet时你不会获得任何类型系统支持。虽然有一个简写,但是:在项目中创建一个figlet.d.ts文件,然后放入declare module "figlet";。这是一个shorthand ambient module,应该足以让您成功导入figlet。

有关详细信息,请查看手册中的consuming declaration filesmodule resolution generally

答案 1 :(得分:1)

Tim回答是完美的,错误是因为导入一些打字稿需要它的类型定义(属性" typings"在目标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}

希望有所帮助