从 Node.js 导入断言的 TypeScript 2.0 / ES2015 方式是啥?

Posted

技术标签:

【中文标题】从 Node.js 导入断言的 TypeScript 2.0 / ES2015 方式是啥?【英文标题】:What is the TypeScript 2.0 / ES2015 way to import assert from Node.js?从 Node.js 导入断言的 TypeScript 2.0 / ES2015 方式是什么? 【发布时间】:2017-02-14 11:43:24 【问题描述】:

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

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

但在 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';

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

我也试过了:

/// <reference path="../../node_modules/@types/node/index.d.ts" />
import assert from 'assert';

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

【问题讨论】:

你已经看过了吗?似乎与您所问的类似:github.com/Microsoft/TypeScript/issues/9725 谢谢,不。我一直在阻止 angular 离开我的世界(我是一只老狗。)不过我会尝试从那个线程中使用 tsconfig.json 技巧。 这些似乎都没有改变我收到的assert 的错误消息。我认为该线程的tsconfig.json 更改主要是我示例中/// reference... 行的替代品。 我推荐阅读***.com/questions/39415661/… 谢谢@RyanCavanaughm。这是否意味着我应该恢复我原来的 import assert = require('assert'),并忽略 Visual Studio 将其标记为与 ES2015 不兼容的事实? 【参考方案1】:

对于Node 10及以上,最好使用strict assert,可以导入为named import并为方便起见重命名as assert

import  strict as assert  from 'assert';

assert.ok(true);

assert(true);

strict 是来自内置 assert 模块的 named export。命名导出避免了问题中提到的许多问题,这些问题来自使用单个 module.exports CommonJS 导出并将其作为默认导入导入。在 TypeScript 2.7 中,添加了 --esmoduleinterop 选项来帮助解决这个问题。

剩下的是老答案,写于 2016 年:

import * as assert from 'assert';

assert.ok(true);

assert(true);

如果您从 node_modules 所在的同一目录运行 typescript,您甚至不需要添加 /// &lt;reference ...

正如@Ryan Cavanaugh 在评论中指出的那样,这种语法提示它可以在原生支持 ES6 模块的环境中工作(尚不存在这样的环境)。不是真的,ES6模块不可能既可以作为命名空间又可以作为函数使用,所以我觉得这个语法还是比较符合现实的:

import assert = require('assert');

但你必须使用打字稿选项

 --target es6 --module commonjs

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

【讨论】:

谢谢。就是这样。 请注意,这将无法在真正的 ES6 环境中实际工作。 我只在 Visual Studio 中得到import assert = require('assert'); 的错误,命令行编译没有给我这个错误。我的tsconfig.json 中有"target": "es2015"。 @RyanCavanaugh,这条消息不正确吗?我应该选择另一个assert 包吗? 感谢您推荐使用strict。人们应该让他们的代码接受尽可能少的行为和输入。如果你想放松规则,有意识地去做并记录下来。【参考方案2】:

首先,将Node.jsTypeScript 定义安装为开发依赖项

npm i -D @types/node

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

import * as assert from 'assert';

【讨论】:

【参考方案3】:

我遇到了同样的问题,并切换到 power-assert 似乎可以正常工作:

import assert from 'power-assert'

【讨论】:

以上是关于从 Node.js 导入断言的 TypeScript 2.0 / ES2015 方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 断言

TypeScript Node.js 包

将 CSV 文件从 URL 导入 Node.js

Node.js的断言模块assert进行单元测试

是否可以使用 node.js 从 URL 导入脚本?

无法从 Node js 应用程序导入 mgt 元素