Записать файл декларации для модуля экспорта по умолчанию

У меня есть модуль npm, называемый RiveScript, который обычно (в Javascript) получает экземпляр таким образом:

var RiveScript = require('rivescript');
var rivescript = new RiveScript();

Я пытаюсь написать файл декларации для модуля, но я застрял на первом шаге. Вот что я написал до сих пор:

declare module "rivescript" {

    interface RivescriptOptions {
        utf8?: boolean;
    }

    class RiveScript {
        constructor(options?: RivescriptOptions);
    }

    export default RiveScript;
}

Тогда я предполагаю, что в Typescript я бы использовал модуль таким образом (импорт по умолчанию):

import RiveScript from 'rivescript';
let rivescript = new RiveScript();

Однако tsc генерирует это, что недопустимо, поскольку оно ссылается на функцию default():

const rivescript_1 = require('rivescript');
let rivescript = new rivescript_1.default();

Что я делаю неправильно?

Ответ 1

Ты действительно близко. Вместо использования export default, вы должны использовать export =.

заказ типизации /rivescript.d.ts

declare module 'rivescript' {
  class RiveScript {
    constructor()
  }
  export = RiveScript
}

app.js

import RiveScript = require('rivescript');
let rivescript = new RiveScript();

Для получения дополнительной информации о том, как писать файлы объявлений, вы должны взглянуть на Руководство по Typescript. Например. у них есть шаблон для экспорта модулей как класса.

Ответ 2

Принято anwser хорошо работает для этого вопроса. Но я хочу дать другую идею

если вы хотите расширить класс, добавьте динамический метод в класс во время выполнения.

вы можете попробовать (src/plugins/processor.ts)

    import server from '../../server'

    declare module "../../server"{
        export default interface server{
            process() // it a new method of server
        }
    }

    export default class{ //another codes, just for show I create a 'server' instance
        private instance:server
        constructor{
            this.instance = new server()
            this.instance.process() //works
        }
    }

в моем server.ts (src/server.ts),

моя подпись класса экспорта по умолчанию

    export default class Server extends extend implements Startable<void>

Поскольку сервер является default export, вы можете изменить server в export default interface server на любое допустимое имя переменной

например:

export default interface anotherName