从 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,您甚至不需要添加 /// <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.js
的TypeScript
定义安装为开发依赖项
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 方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章