Что такое TypeScript 2.0/ES2015 способ импорта assert из Node.js?

Я запускаю 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.

Ответ 1

Для узла 10 и выше лучше использовать строгий assert, который можно импортировать как именованный import и переименовать для удобства as assert:

import { strict as assert } from 'assert';

assert.ok(true);

assert(true);

strict именованный экспорт из встроенного модуля assert. Именованный экспорт позволяет избежать многих проблем, упомянутых в этом вопросе, - проблем, возникающих при использовании одного module.exports Экспорт CommonJS-экспорта и импорт в качестве импорта по умолчанию. В TypeScript 2.7 была добавлена опция --esmoduleinterop чтобы помочь с этим. Остальное - старый ответ, написанный в 2016 году:

import * as assert from 'assert';

assert.ok(true);

assert(true);

Если вы запускаете машинопись из того же каталога, где находится node_modules, вам даже не нужно добавлять ///<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 ошибку Import with 'require' cannot be used when targeting ECMAScript 6 or higher. Вы также можете использовать только --target es5 если это то, что вам нужно.

Ответ 2

Сначала установите определения TypeScript для Node.js

npm i @types/node

Затем вы можете импортировать модуль assert :-)

import * as assert from 'assert';

Ответ 3

У меня была та же проблема, и я переключился на power-assert, который, похоже, отлично работает:

import assert from 'power-assert'