【问题标题】:Write a declaration file for a default export module为默认导出模块编写声明文件
【发布时间】:2016-12-30 17:54:06
【问题描述】:

我有一个名为 RiveScript 的 npm 模块,通常(在 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();

我做错了什么?

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    如果您正在寻找适用于默认导出函数的解决方案:

    declare module "my-module" {
      function myFunction(foo: number): string;
    
      export default myFunction;
    }
    

    【讨论】:

      【解决方案2】:

      你真的很亲密。您应该使用export =,而不是使用export default

      自定义类型/rivescript.d.ts

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

      app.js

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

      有关如何编写声明文件的更多信息,您应该查看Typescript Handbook。例如。他们有一个“将模块作为一个类导出”的模板。

      【讨论】:

      • 它有效,谢谢!我只是对import RiveScript = require('rivescript'); 语法看起来不像是有效的 ES6 导入语句这一事实感到困惑?
      • 据我了解,import Rivescript from 'rivescript'应该导入Rivescript的默认导出。但是,没有默认导出:github.com/aichaos/rivescript-js/blob/master/src/…。完整概述:github.com/Microsoft/TypeScript/issues/2242
      • 似乎import Rivescript from 'rivescript' 工作正常,并且至少使用我正在使用的最新 Typescript 3.3 导入默认导出。
      【解决方案3】:

      Accepted anwser 非常适合这个问题。但我想提出另一个想法

      如果您想扩展类,请在运行时为类添加动态方法。

      你可以试试(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
              }
          }
      

      在我的server.ts(src/server.ts) 中,

      我的默认导出类签名

          export default class Server extends extend implements Startable<void>
      

      因为Server是default export,所以可以将export default interface server中的server改成任何有效的变量名

      例如:

      export default interface anotherName    
      

      【讨论】:

        猜你喜欢
        • 2020-03-22
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        相关资源
        最近更新 更多