TypeScript的import/as和import/require有什么区别?

151

我正在使用 TypeScript 和 Express/Node.js。

对于消耗模块,TypeScript 手册显示以下语法:

import express = require('express');

但是typescript.d.ts文件也显示:

import * as express from "express";

我也查看了MSDN博客,但是没有找到任何相关内容。

截至2016年初,哪一个更正确?如果有不同之处,请说明。

在哪里可以找到最新语法的最佳信息来源,以便在将来查找此信息?

2个回答

205

这些几乎是等效的,但是 import * 有一些限制,import ... = require 没有。

import * as 创建了一个标识符,它是一个模块对象,强调对象。根据ES6规范,此对象不可调用或使用new - 它只有属性。如果您要导入函数或类,则应该使用

import express = require('express');
或者(取决于您的模块加载器)
import express from 'express';

根据ES6规范,在使用import * as express后调用express()是非法的。在某些运行时加转译环境中,这可能仍然有效,但未来任何时候都可能不再起作用而且没有警告,这会让你感到难过。


7
一般情况下,你应该使用ES6语法,除非你有一些特殊原因不使用(我目前想不出任何理由)。如果需要,可以查看我在这个重复的问题中给出的回答来了解为什么不使用ES6语法。链接:https://dev59.com/lV0b5IYBdhLWcg3wGN_f。 - C Snover
我对这里的明显矛盾有点困惑。我应该遵循哪个建议?@CSnover,您的建议在2016年仍然适用吗?谢谢。 - Adam Thompson
1
@AdamThompson 是的,请看“2016更新”部分。 - C Snover
在 Visual Studio 的源代码中,我发现他们写了 import express = require('express'); - cwtuan
3
@Ryan Cavanaugh,“depending on your module loader”是什么意思?我如何找出自己的模块加载器?谢谢。 - Old Geezer
没问题。但是我该如何指示TypeScript转译器输出import而不是require()? - Thomas Weller

36
import * as express from "express";

这是建议的方法,因为自去年以来,它已成为JavaScript(ES6/2015)的标准。

无论如何,在您的tsconfig.json文件中,您应该将模块选项目标设置为commonjs,这是nodejs支持的格式。


8
这意味着 express 应该是 exports 的一个对象,不能被称为 express(),否则就没有意义。 - Emobe
1
@Emobe 我发现只有当你的ts.config设置了 "esModuleInterop": true 时才是正确的。如果将该标志设置为false,则express()似乎是有效的代码。 - Sam
@Sam 是有效的,但不够简洁。这样使用它是没有意义的。 - Emobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接