首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript通过引用传递属性

Typescript通过引用传递属性
EN

Stack Overflow用户
提问于 2019-10-03 04:56:08
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
class MyClass {
     private x: number;
     private y: number;
     private z: number;
     private w: number;
}

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

代码语言:javascript
复制
   incrementX() { this.x++; }
   incrementY() { this.y++; )
   ...

然而,我不希望增量逻辑(++)被复制,我想把它放在一个函数中。如果Typescript有像C#这样的ref参数,我会这样做:

代码语言:javascript
复制
   incrementX() { this.increment(ref this.x); }
   increment(p: ref number) { p++; }

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

代码语言:javascript
复制
   incrementX() { this.increment("x"); }
   increment(p: string) {
       const self = this as any;
       self[p]++;
   }

它不是类型安全的。我可以很容易地调用increment('not-a-property'),而不会收到来自编译器的错误。我添加了一个运行时检查,以确保selfp确实是一个数字,但我仍然希望编译器能捕捉到一些东西。

有没有一种类型安全的方法来实现这一点?

注意:很明显,我的实际代码并没有递增数字,而是做了一些相当复杂的事情--不是针对数字,而是针对另一个类类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-03 05:21:13

也许你可以使用keyofnumber extends?只允许传递类的键,这些键是数字。

Playground here

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2019-10-03 05:21:36

一种解决方案是使用keyof MyClass键入p。

代码语言:javascript
复制
     increment(p: keyof MyClass): void {
       this[p]++;
     }

但这行不通。因为您的number字段是private,并且在MyClass的键中有increment函数本身。

一种解决方案是只提取数字字段:

代码语言:javascript
复制
type OnlyNumberKeys<O> = {
  [K in keyof O]: O[K] extends number ? K : never;
}[keyof O];

然后在increment函数中使用此类型:

代码语言:javascript
复制
class MyClass {
     x: number;
     y: number;
     z: number;
     w: number;

     increment(p: OnlyNumberKeys<MyClass>): void {
       this[p]++;
     }
}

现在p只接受'x' | 'y' | 'z' | 'x'

请注意,我必须删除所有private关键字。我不知道是否有解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58209234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档