Каков способ TypeScript 2.0/ES2015 для импорта утверждений из 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.


person Burt_Harris    schedule 05.10.2016    source источник


Ответы (3)


Для Node 10 и выше лучше использовать strict 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);

Если вы запускаете typescript из того же каталога, где находится 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. Вы также можете использовать только опцию --target es5, если это то, что вам нужно.

person artem    schedule 05.10.2016
comment
Спасибо. Это делает это. - person Burt_Harris; 06.10.2016
comment
Обратите внимание, что это не будет работать в реальной среде ES6. - person Ryan Cavanaugh; 06.10.2016
comment
Я получаю только ошибку import assert = require('assert'); в Visual Studio, компиляция командной строки не дает мне этого. У меня "target": "es2015" в моем tsconfig.json. @RyanCavanaugh, это сообщение неверно? Должен ли я выбрать другой пакет assert? - person Burt_Harris; 08.10.2016
comment
Спасибо за рекомендацию использовать strict. Люди должны заставить свой код принимать как можно меньше поведения и входных данных. Если вы хотите смягчить правила, сделайте это сознательно и задокументируйте это. - person masterxilo; 04.03.2019

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

npm i -D @types/node

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

import * as assert from 'assert';
person Yas    schedule 04.04.2018

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

import assert from 'power-assert'
person James McLaughlin    schedule 28.05.2017