#javascript #node.js #typescript #commonjs #typescript-typings
#javascript #node.js #typescript #commonjs #typescript-типизации
Вопрос:
В моем проекте TypeScript я хочу использовать Logdown.
Logdown может использоваться в Node.js приложение, подобное этому:
var Logdown = require('logdown')
var logger = new Logdown({prefix: 'test'})
logger.info('Hello World');
К сожалению, Logdown не предоставляет объявлений, поэтому я хотел написать файл объявления.
Чтобы запустить этот небольшой проект, я сделал следующее:
- Я клонировал репозиторий Logdown
- Я создал запись «typings» в
package.json
файле клонированного репозитория Logdown и указал на нееdist/logdown.d.ts
(в соответствии с «Включением объявлений в ваш пакет npm«) - Я сделал клонированный репозиторий Logdown локально доступным как пакет npm (
npm link
) - Я запустил
npm link logdown
в своем приложении TypeScript, чтобы указать ссылку на этот модуль узла на мой клонированный репозиторий
После этого я создал содержимое для logdown.d.ts
файла:
export declare class Logdown {
constructor(options: Object);
public info(text: string): string;
}
Я надеялся, что смогу использовать now Logdown в моем проекте TypeScript следующим образом:
import Logdown = require("logdown");
let logger: Logdown = new Logdown();
logger.info('Hello World!');
Но когда я компилирую проект, я получаю следующие ошибки:
ошибка TS2304: не удается найти имя «Logdown».
ошибка TS2351: невозможно использовать ‘new’ с выражением, в типе которого отсутствует сигнатура вызова или построения.
Комментарии:
1. Это может быть простая опечатка: это прописано
types
вpackage.json
, а неtypings
. Кроме того, это не работает для typescript старше 2.0.2. Настройка в порядке. Обратите внимание, что поле «typings» является синонимом «types». Я думаю, что проблема находится внутри
logdown.d.ts
.
Ответ №1:
У меня получилось: мне нужно было изменить формат экспорта на export = Logdown;
в файле определения ( .d.ts
) и формат импорта на import Logdown = require("logdown");
в моем приложении TypeScript.
Logdown.d.ts (определение экспорта)
declare class Logdown {
constructor(options?: Object);
public log(...args: string[]): void;
public info(...args: string[]): void;
public warn(...args: string[]): void;
public debug(...args: string[]): void;
public error(...args: string[]): void;
public static disable(...args: string[]): void;
public static enable(...args: string[]): void;
}
export = Logdown;
Приложение TypeScript (импорт)
import Logdown = require("logdown");
...
let logger: Logdown = new Logdown();
logger.info('Hello from Logdown!');