在我的打字稿项目中,我使用:
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)
我该如何导入这些库?
关键是 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。
请查看手册中的消耗声明文件和模块解析以获取更多详细信息。
蒂姆的回答是完美的,错误是因为导入一些打字稿需要它的类型定义(目标 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}希望能帮助到你
| 归档时间: |
|
| 查看次数: |
5323 次 |
| 最近记录: |