Когда я пытаюсь импортировать модуль node.js в Typescript следующим образом:
import co = require('co');
import co from 'co';
Без определения типов обе строки сообщают об одной и той же ошибке:
error TS2307: Cannot find module 'co'.
Как правильно импортировать?
4 ответа
Уловка состоит в том, чтобы использовать чисто нотацию JavaScript:
const co = require('co');
Просто импортируйте модуль следующим образом:
import 'co';
У меня возникла ошибка, когда я использовал подход «Определение типа заглушки» в ответе Тима Перри: error TS2497: Module ''module-name'' resolves to a non-module entity and cannot be imported using this construct.
Решением было немного переработать заглушку .d.ts
файла:
declare module 'module-name' {
const x: any;
export = x;
}
А затем вы можете импортировать через:
import * as moduleName from 'module-name';
Создание собственного файла-заглушки снижает барьер для написания реальных деклараций по мере необходимости.
Ваши варианты: либо импортировать его за пределы модульной системы TypeScript (путем прямого вызова API модуля, такого как RequireJS или Node), чтобы он не пытался его проверить, либо добавить определение типа, чтобы вы могли использовать модульную систему и правильно проверить. Однако вы можете заглушить определение типа, так что это может потребовать очень мало усилий.
Прямое использование импорта из Node (CommonJS)
// Note there's no 'import' statement here.
var loadedModule: any = require('module-name');
// Now use your module however you'd like.
Прямое использование RequireJS:
define(["module-name"], function (loadedModule: any) {
// Use loadedModule however you'd like
});
Имейте в виду, что в любом из этих случаев это может странно смешиваться с использованием реального обычного импорта модулей TypeScript в том же файле (вы можете получить два уровня определения модуля, особенно на стороне RequireJS, поскольку TypeScript пытается управлять модулями, которые вы также управление вручную). Я бы рекомендовал либо использовать только этот подход, либо использовать определения реальных типов.
Определения типа заглушки:
Было бы лучше всего получить правильные определения типов, и если они доступны или у вас есть время написать их самостоятельно, вам определенно следует это сделать.
В противном случае вы можете просто присвоить своему модулю тип any
и поместить его в модульную систему, не набирая его:
declare module 'module-name' {
export = <any> {};
}
Это должно позволить вам импортировать module-name
и дать TypeScript понять, о чем вы говорите. Вам по-прежнему необходимо убедиться, что при импорте имя-модуля он действительно успешно загружается во время выполнения с любой системой модулей, которую вы используете, иначе он будет компилироваться, но затем не запустится.
Похожие вопросы
Связанные вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.