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

JS构造函数的TypeScript类型定义应选用类、命名空间还是其他类型?

给你的JavaScript构造函数编写TypeScript类型定义:该选哪种方式?

先直接给结论:命名空间完全不适合你的场景,而declare class或者接口+构造函数类型是更合适的选择,具体看你的需求。


为什么排除命名空间?

命名空间(Namespace)的核心作用是把一组相关的变量、函数、类打包在一起,避免全局作用域污染。但你的代码是直接导出了一个独立的构造函数MyFunction,没有嵌套的功能集合,用命名空间反而会把简单的结构复杂化,完全没必要。


选项1:declare class(最直观,推荐新手用)

如果你的MyFunction是通过new关键字实例化的(比如const instance = new MyFunction(p1, p2)),declare class是最直观的写法,完美匹配“构造函数+实例方法”的结构:

// MyFunction.d.ts
export declare class MyFunction {
  // 构造函数的参数类型(把any替换成你实际的类型)
  constructor(param1: any, param2: any);

  // 实例方法on的类型定义
  on(evt: string, cb: (...args: any[]) => void): void;

  // 实例方法off的类型定义
  off(evt: string, cb: (...args: any[]) => void): void;
}

这个写法和TS原生类的语法完全一致,其他开发者一眼就能理解,而且能正确提示new调用的语法。


选项2:接口+构造函数类型(更贴合JS本质)

如果你想更贴近JavaScript中“普通函数作为构造函数”的本质,可以先定义实例的接口,再声明构造函数的类型:

// MyFunction.d.ts
// 首先定义实例的结构:外部能访问的方法都在这里
export interface MyFunctionInstance {
  on(evt: string, cb: (...args: any[]) => void): void;
  off(evt: string, cb: (...args: any[]) => void): void;
}

// 然后声明构造函数本身:可以通过new创建MyFunctionInstance实例
export declare const MyFunction: {
  new(param1: any, param2: any): MyFunctionInstance;
};

这种写法的优势是灵活性更强——比如如果你的MyFunction既可以用new实例化,又能直接调用返回其他值,你可以轻松扩展构造函数的类型:

export declare const MyFunction: {
  new(param1: any, param2: any): MyFunctionInstance;
  // 假设直接调用该函数会返回一个字符串
  (param1: any, param2: any): string;
};

重要细节

  • 你的JS代码中executeRequest是内部私有变量,没有暴露到实例上,外部代码无法访问,所以类型定义里完全不需要包含它。
  • 示例中的any是占位符,记得替换成你业务中实际的参数类型、回调参数类型,让类型定义更严谨。

内容的提问来源于stack exchange,提问作者Maks K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:01:10