【问题标题】:How to transform require into import statement for third party library?如何将 require 转换为第三方库的导入语句?
【发布时间】:2018-06-17 03:00:27
【问题描述】:

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

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'.

我应该如何导入这些库?

【问题讨论】:

    标签: typescript tslint


    【解决方案1】:

    Tim 的答案是完美的,错误是因为要导入一些 typescript 需要它的类型定义(目标 package.json 中的属性“typings”指向带有模块描述的 .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}

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

      如果您没有现有的基础架构,最简单的方法通常是 npm。例如,对于 aws-sdk,如果您运行 npm install --save @types/aws-sdk,那么类型定义将被下载到项目中的 node_modules/@types/aws-sdk,TypeScript 编译器会自动在那里找到它们,所以如果您导入 aws-sdk,它就会知道是什么继续。

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

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

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

      查看手册中的consuming declaration filesmodule resolution generally 了解更多详情。

      【讨论】:

        猜你喜欢
        • 2023-01-19
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        相关资源
        最近更新 更多