如何在TypeScript中声明带自定义属性的函数式模块?
正确编写@drumwork/tone的TypeScript声明文件
你当前编写的声明文件存在语法错误,且未准确描述库的结构——这个库导出的是一个带附加属性的函数,而非单独导出函数与属性。
你的错误声明代码:
declare module '@drumwork/tone' { declare let mod = function (str: string): string mod.list = (str: string) => Array<string> export default mod }
对应的JavaScript库实现:
function main(str) { // return some newly generated string return str + str } main.list = (str) => [...str] export default main
官方给出的示例将list作为独立导出的函数,与库的实际结构不符,因此无法满足需求。
正确的声明写法
要准确描述“函数本身可调用,同时带有list属性”的结构,有两种简洁且符合规范的写法:
写法一:接口扩展函数类型
declare module '@drumwork/tone' { // 定义主函数的类型 type MainFunction = (str: string) => string; // 定义包含list属性的接口,继承主函数类型 interface ToneModule extends MainFunction { list: (str: string) => string[]; } // 导出带属性的函数作为默认导出 const mod: ToneModule; export default mod; }
写法二:直接定义复合类型
declare module '@drumwork/tone' { const mod: { (str: string): string; list: (str: string) => string[]; }; export default mod; }
原写法失效原因
- 模块内部重复使用
declare关键字属于冗余写法,模块级声明无需额外添加declare - 直接赋值式的写法不符合TypeScript声明文件的语法规范,需先定义类型再声明变量
采用上述正确写法后,TypeScript就能准确识别:默认导出的是一个可调用的函数,同时该函数拥有list方法。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

