打字稿导入/作为vs import/require?

Ada*_*son 70 javascript node.js express typescript

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

对于使用模块,TypeScript手册显示以下语法:

import express = require('express');

typescript.d.ts文件也显示:

import * as express from "express";

我还搜索了MSDN博客,但找不到任何东西.

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

哪个是查找有关最新语法的信息的最佳来源,以便将来可以找到这些信息?

Rya*_*ugh 114

这些大多是等价的,但import *有一些限制import ... = require却没有.

import * as创建一个标识符作为模块对象,强调对象.根据ES6规范,此对象永远不可调用或new无法使用 - 它只具有属性.如果您正在尝试导入函数或类,则应该使用

import express = require('express');
Run Code Online (Sandbox Code Playgroud)

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

import express from 'express';
Run Code Online (Sandbox Code Playgroud)

根据ES6规范,尝试使用import * as express然后调用express()始终是非法的.在某些运行时+转换环境中,无论如何这可能会起作用,但是在未来的任何时候它都可能会在没有警告的情况下中断,这会让你感到难过.

  • "一般情况下你应该使用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). (4认同)
  • @Ryan Cavanaugh“取决于模块加载程序”是什么意思?如何找出我拥有的模块装载器?谢谢。 (2认同)

thi*_*ple 13

import * as express from "express";
Run Code Online (Sandbox Code Playgroud)

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

在任何情况下,在tsconfig.json文件中,您应该将模块选项定位到commonjs,这是nodejs支持的格式.

  • 但这意味着`express`应该是导出对象,将其称为`express()`没有意义。 (5认同)