什么是TypeScript 2.0/ES2015从Node.js导入断言的方法?

Bur*_*ris 25 typescript typescript-typings

我正在运行TypeScript 2.0.3,配置为"target": "es2015",.我开始了

/// <reference path="../../node_modules/@types/node/index.d.ts" />
import assert = require('assert');
Run Code Online (Sandbox Code Playgroud)

但是在Visual Studio中,标记了一个工具提示,Import with 'require' cannot be used when targeting ECMAScript 6 or higher.然后我尝试了:

/// <reference path="../../node_modules/@types/node/index.d.ts" />
import {assert} from 'assert';
Run Code Online (Sandbox Code Playgroud)

哪个生成 Error TS2305 Module '"assert"' has no exported member 'assert'.

我也尝试过:

/// <reference path="../../node_modules/@types/node/index.d.ts" />
import assert from 'assert';
Run Code Online (Sandbox Code Playgroud)

哪个生成 Error TS1192 Module '"assert"' has no default export.

art*_*tem 37

对于节点10及更高版本,最好使用strict assert,它可以作为命名import导入并为方便起见重命名as assert:

import { strict as assert } from 'assert';

assert.ok(true);

assert(true);
Run Code Online (Sandbox Code Playgroud)

strict是内置模块的命名导出assert.命名导出避免了问题中提到的许多问题,即使用单个module.exportsCommonJS导出并将其作为默认导入导入的问题.在TypeScript 2.7中,--esmoduleinterop添加了选项以帮助完成此操作.

其余的是旧答案,写于2016年:

import * as assert from 'assert';

assert.ok(true);

assert(true);
Run Code Online (Sandbox Code Playgroud)

如果你从同一个目录运行typescript node_modules,你甚至不需要添加/// <reference ...

作为@Ryan卡瓦诺在评论指出,这句法提示的假设,它会在ES6模块的原生支持的环境中工作(没有这样的环境还不存在).事实并非如此,不可能将ES6模块用作命名空间和函数,所以我认为这种语法仍然可以更好地匹配现实:

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

但你必须使用typescript选项

 --target es6 --module commonjs
Run Code Online (Sandbox Code Playgroud)

摆脱Import with 'require' cannot be used when targeting ECMAScript 6 or higher错误.--target es5如果您需要,您也可以单独使用选项.


Yas*_*Yas 5

首先,安装TypeScript的定义Node.js

npm i @types/node
Run Code Online (Sandbox Code Playgroud)

然后,您可以导入assert模块:-)

import * as assert from 'assert';
Run Code Online (Sandbox Code Playgroud)