类型脚本通过引用传递属性 [英] Typescript pass property by reference
本文介绍了类型脚本通过引用传递属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个具有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]确实是一个数字,但我仍然需要编译器可以捕获的内容。
是否有实现此功能的类型安全方法?
注意:显然,我的实际代码不是递增数字,而是执行一些非常精细的操作--不是针对数字,而是针对另一个类类型。
推荐答案
您可以使用keyof
和number extends
可能?仅允许传递为数字的类的键。
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
这篇关于类型脚本通过引用传递属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文