在我的打字稿项目中,我使用:
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'.
我想如何导入这些库?
答案 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 files和module resolution generally。
答案 1 :(得分:1)
你也可以试试这个: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}
希望有所帮助