为默认导出模块编写声明文件

Posted

技术标签:

【中文标题】为默认导出模块编写声明文件【英文标题】: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();

我做错了什么?

【问题讨论】:

【参考方案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    

【讨论】:

以上是关于为默认导出模块编写声明文件的主要内容,如果未能解决你的问题,请参考以下文章

JS ES6:声明const并将其导出为默认值与将其直接声明为默认导出之间的区别

ES6:模块“猫鼬”没有默认导出

将 CommonJS 默认导出导入为命名导出/无法加载 ES 模块

ES6模块化

未找到导出默认值

在 TypeScript 中使用单个模块生成声明文件