类型脚本通过引用传递属性脚本、属性、类型

2023-09-03 09:40:20 作者:好听的女生长:老板╮给姐来半斤帅哥

我有一个具有4个不同属性的TypeScrip类,如下所示:

class MyClass {
     private x: number;
     private y: number;
     private z: number;
     private w: number;
}

我想创建四个函数来递增这些属性:

   incrementX() { this.x++; }
   incrementY() { this.y++; )
   ...
但是,我不希望复制增量逻辑(++),我希望将其放在一个函数中。如果TypeScrip有像C#这样的ref参数,我会这样做:

   incrementX() { this.increment(ref this.x); }
   increment(p: ref number) { p++; }
前端性能指标和优化目标

TypeScrip不支持按引用传递。实现这一点的非类型安全方法是:

   incrementX() { this.increment("x"); }
   increment(p: string) {
       const self = this as any;
       self[p]++;
   }

它不是类型安全的。我可以轻松地调用increment('not-a-property'),而不会收到来自编译器的错误。我添加了一个运行时检查,以确保self[p]确实是一个数字,但我仍然需要编译器可以捕获的内容。

是否有实现此功能的类型安全方法?

注意:显然,我的实际代码不是递增数字,而是执行一些非常精细的操作--不是针对数字,而是针对另一个类类型。

推荐答案

您可以使用keyofnumber extends可能?仅允许传递为数字的类的键。

Playground here

class MyClass {
  public a: number = 0;
  public b: number = 0;
  public c: string = "";

  public increment(
     key: {
      [K in keyof MyClass]-?: number extends MyClass[K] ? K : never
    }[keyof MyClass]
  ) {
    this[key]++;
  }
}

const test = new MyClass();

test.increment("a");
test.increment("b");
test.increment("c"); // fail
test.increment("d"); // fail