是否可以直接在ES6类的方法上声明额外自定义属性?
给类方法添加自定义属性的实现方案
有三种常用的简便实现方式,和你之前用函数+命名空间合并的思路本质一致,核心都是给方法对应的函数额外声明属性类型+赋初始值:
- 方案1:构造函数内初始化(类型最安全,无额外类型声明)
// 先定义带自定义属性的函数类型 type F1Type = (() => string) & { found: boolean } export class Something { f1: F1Type constructor() { // 初始化方法逻辑 this.f1 = () => { // 你的业务逻辑 this.f1.found = /* 你的判断逻辑 */ true return 'result' } // 自定义属性赋初始值 this.f1.found = false } }
- 方案2:扩展原型方法(适合不想改构造函数的场景)
export class Something { f1(): string { // 类型断言后直接使用自定义属性 const f1 = this.f1 as typeof this.f1 & { found: boolean } f1.found = /* 判断逻辑 */ false return 'result' } } // 给原型方法的自定义属性赋初始值 (Something.prototype.f1 as any).found = false // 可选:全局扩展类型,后续所有调用f1都能直接识别found属性,不需要每次断言 declare module './你的当前文件路径' { interface Something { f1: (() => string) & { found: boolean } } }
- 方案3:使用装饰器(适合批量给多个方法加自定义属性的场景)
// 定义属性装饰器 function AddFoundProperty(initialValue: boolean) { return function (target: any, methodName: string) { target[methodName].found = initialValue } } export class Something { @AddFoundProperty(false) f1(): string { (this.f1 as any).found = true return 'result' } } // 同样可以加全局类型声明避免每次断言
如果你的自定义属性是所有实例共享的,直接给原型方法赋值即可;如果需要每个实例的f1的found属性独立,就用方案1在构造函数内初始化每个实例自己的f1方法。
内容的提问来源于stack exchange,提问作者BlindChicken
相关产品推荐
相关产品推荐

