web-dev-qa-db-fra.com

Écrire un fichier de déclaration pour un module d'exportation par défaut

J'ai un module npm appelé RiveScript qui est habituellement (en Javascript) instancié de cette façon:

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

J'essaie d'écrire un fichier de déclaration pour le module, mais je suis bloqué à la première étape. Voici ce que j'ai écrit jusqu'à présent:

declare module "rivescript" {

    interface RivescriptOptions {
        utf8?: boolean;
    }

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

    export default RiveScript;
}

Ensuite, je suppose que dans TypeScript, j'utiliserais le module de cette façon ( import par défaut ):

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

Cependant, tsc génère ceci, ce qui n'est pas valide car il fait référence à une fonction default():

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

Qu'est-ce que je fais mal?

11
julien_c

Tu es vraiment proche. Au lieu d'utiliser export default, vous devriez utiliser export =

custom-typings/rivescript.d.ts

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

app.js

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

Pour plus d'informations sur la rédaction de fichiers de déclaration, consultez le TypeScript Handbook . Par exemple. ils ont un modèle pour 'exporter des modules en tant que classe' .

21
Pelle Jacobs

Réponse acceptée fonctionne bien pour cette question. Mais je veux donner une autre idée

si vous voulez extend class, ajoutez une méthode dynamique à class lors de l’exécution.

vous pouvez essayer (src/plugins/processor.ts)

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

    declare module "../../server"{
        export default interface server{
            process() // it's 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
        }
    }

dans mon server.ts (src/server.ts), 

ma signature de classe d'exportation par défaut

    export default class Server extends extend implements Startable<void>

Parce que Server est un default export, vous pouvez donc changer server dans export default interface server en n'importe quel nom de variable valide.

par exemple:

export default interface anotherName    
0
toffee