【问题标题】:Is there a way to declare a property directly on a ES6 class method有没有办法直接在 ES6 类方法上声明属性
【发布时间】:2021-12-24 15:03:44
【问题描述】:

如果我有一个像下面这样的类和方法,我想知道是否有一种方法可以轻松地在 f1 方法上声明一个额外的属性?

export class Something {
    f1(): string { ... }
}

当不在课堂环境中时,我可以这样做:

function f1(): string {
    // Simple example. 
    if ( ... ) {
        f1.found = true;
    } else {
        f1.found = false;
    }
    
}

namespace f1 {
    export let found = false;
}

由于命名空间与函数定义合并,因此不会出现错误。

【问题讨论】:

  • 您能否提供有关该用例的更多信息?由于方法由所有实例共享,因此方法上的任何标志也将被共享。那是你要的吗?为什么需要方法本身的附加属性而不是仅使用类属性?
  • @FelixKling 是的,所以我想尝试存储额外的信息,因为我不想更改函数的返回值和类型。这将使我能够在函数上存储foundlastKey 之类的内容,以便像这样使用:s1 = new Something() s1.f1(...); if (s1.f1.found) { ... } 这是因为函数总是会返回一些东西。还有例如我可以存储一个lastKey 变量,然后从函数中获取。
  • “因为我不想改变函数的返回值和类型” 那你为什么要把它转换成类方法呢?我的意思是,您想要的并非不可能,但如果您无论如何都在重构您的代码,为什么不花时间正确设计 API?
  • @BlindChicken 请改用s1.found。或s1.f1Found。或者更好的是,只需将标志放在s1.f1() 的返回值上。就像 Felix 说的,不要在函数对象上放一个全局标志。

标签: typescript ecmascript-6


【解决方案1】:

请考虑这些例子。

第一个 - 将f1 声明为constructor 内的箭头函数。

type F1 = {
  bound: boolean;
  (): string;
};

class Something {
  public f1: F1
  constructor() {

    const f1: F1 = () => 'hello'
    f1.bound = true;

    
  }

const result = new Something().f1
result.bound // boolean

第二个 - 将f1 声明为constructor 之外的函数

type F1 = {
  bound: boolean;
  (): string;
};

function f1() {
  return ''
}

f1.bound = true;

class Something {
  public f1: F1
  constructor() {
    this.f1 = f1.bind(this)
  }
}

const result = new Something().f1
result.bound // boolean

第三

type F1 = {
    bound: boolean;
    (): string;
};

class Something {
    f1: F1
    constructor() {
        function f1() {
            return 'String'
        }
        f1.bound = true
        this.f1 = f1.bind(this)
    }
}

const result = new Something().f1
result.bound // boolean

这也取决于你是否在f1 方法中使用this

请参阅this question 关于在 typescript 的函数中使用静态属性。

【讨论】:

  • 几点注意事项: (1) f1.bind(this) 在第一个示例中是不必要的,因为您将 f1 声明为箭头函数。 (2) result.bound 在这两个示例中都不存在,因为.bind 返回的新函数不保留原始函数的属性。 (3) 假设您在示例 1 中的箭头函数或示例 2 中找到的边界上设置了bound,那么该标志对于类的每个实例都是唯一的。这可能是也可能不是 OP 想要的(我问过,但他们的回答没有解决这个问题)。
  • @FelixKling 谢谢,你说得对,我删除了bind。至于(3),我也不确定OP为什么要使用这个标志,只是为他提供了一些选项
  • Re (3),我实际上想说的是,为了确保这一点,值得指出这种行为。您的第二个示例仍需要更改为 this.f1.bound = true;
  • @FelixKling 谢谢。对于反馈,我提供了第三个示例
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多