2016-02-29 197 views
29

我使用TypeScript和Express/Node.jsTypescript import/as vs import/require?

对于消费模块,打字稿手册显示的语法如下:

import express = require('express');

而且还有typescript.d.ts文件显示:

import * as express from "express";

我还搜查了MSDN博客,但不能找到什么。

到2016年初,哪一个更正确?两者之间有什么区别,如果有的话?

哪里找最新的语法信息的最佳来源,以便我可以在未来找到这些信息?

+2

我不知道什么是最好的,但这是非常好的https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript –

回答

55

这些大部分是等价的,但import *有一些限制import ... = require没有。

import * as创建的标识符是一个模块对象,重视对象。根据ES6规范,这个对象永远不可调用或者可以使用 - 它只有属性。如果你想导入一个函数或类,你应该使用

import express = require('express'); 

或(取决于你的模块加载器)

import express from 'express'; 

尝试使用import * as express,然后调用express()始终是非法根据ES6规范。在某些运行时+转译环境中,这可能会发生作用,但它可能会在未来的任何时候突然中断,而不会发出警告,这会让您感到难过。

+3

“一般来说,你应该使用ES6语法,除非你有什么理由不会(我想不出任何副手)“FWIW我[给出了答案为什么不](http://stackoverflow.com/a/29598404/252087)在这个[这个重复的问题](http: //stackoverflow.com/questions/29596714/new-es6-syntax-for-importing-commonjs-amd-modules-ie-import-foo-require)。 –

+0

我在这里明显的矛盾之间有点困惑。我应该遵循哪些建议? @ 2016年你的建议仍然与2016年一样适用,就像你发布它的时候一样?谢谢。 –

+1

@AdamThompson是的,请参阅“2016更新”部分。 –

3
import * as express from "express"; 

这是推荐的方式,因为它是去年以来的JavaScript标准(ES6/2015)。

无论如何,在你的tsconfig.json文件中,你应该将模块选项定位到commonjs,这是nodejs支持的格式。