You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

原写法失效原因

  1. 模块内部重复使用declare关键字属于冗余写法,模块级声明无需额外添加declare
  2. 直接赋值式的写法不符合TypeScript声明文件的语法规范,需先定义类型再声明变量

采用上述正确写法后,TypeScript就能准确识别:默认导出的是一个可调用的函数,同时该函数拥有list方法。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:55:05