TypeScript 中 `import from` 和 `import require` 的区别

Posted

技术标签:

【中文标题】TypeScript 中 `import from` 和 `import require` 的区别【英文标题】:Difference between `import from` and `import require` in TypeScript 【发布时间】:2016-10-05 17:03:52 【问题描述】:

我使用 node.js,最近决定试一试 TypeScript,但我对如何导入模块有点困惑。我看到两种不同的语法,但我不知道它们到底有什么区别:

import * as a from 'a'; // ES6 standard to import stuff
// OR ...
import a = require('a');

这些是一样的吗?如果不是,我应该在哪里使用它们?

【问题讨论】:

【参考方案1】:

import * as a from 'a'; 是新的“ES6 风格”导入语法(从 Typescript 1.5 开始可用)。

现在应尽可能使用此语法。

但有一个警告。 ES6 导入语法只能导入模块(由 ES6 定义)或作为模块的一部分导出的对象(类、接口、变量...)。

一些 javascript 库会直接导出一个函数或类,对应的定义文件通常如下所示:

declare module "my-class" 

    class MyClass  ... 

    export = MyClass
 

在这种情况下,“旧”导入语法是唯一可以使用的语法

import MyClass = require("my-class");

不使用此语法将导致错误 TS2497

查看this issue 了解详细信息和可能的解决方法,在前一种情况下,将空模块声明添加到定义文件中

declare module "my-class" 

    class MyClass  ... 

    module MyClass  // <=

    export = MyClass
 

【讨论】:

当 require 适用于所有情况(看起来)为什么我应该使用 import from 语法呢? @Rsh 因为你希望尽可能多地兼容 ES6,因此 Typescript 仍然是 Javascript 的超集,而不是它的语言。

以上是关于TypeScript 中 `import from` 和 `import require` 的区别的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript接口学习心得之一

Typescript和Node模块解析策略

基于 TypeScript 的 IoC 与 DI

你如何在Typescript中优雅地导入AWS-Lambda?

Typescript Service在声明之前不使用块作用域变量'place'的错误

使用带有Typescript的样式化组件,prop不存在?