Файл определения TypeScript для существующего модуля узла

#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!');