为默认导出模块编写声明文件
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并将其导出为默认值与将其直接声明为默认导出之间的区别