![](/img/trans.png)
[英]How can I dynamically set foo equal to Object Property Name in Javascript/AngularJS?
[英]How can I dynamically set a property on an object in right way?
我正在使用Typescript 。 我想知道如何在对象上动态设置属性,以便Typescript识别分配。
例如,
class Foo {
constructor(obj: object) {
for (const key in obj) {
this[key] = obj[key]
}
}
}
const bar = new Foo({
x: 1,
y: 2,
});
bar.x; // Property 'x' does not exist on type 'Foo'
我正在尝试做的是:
class State {
private state: string;
constructor (states: string[]) {
states.forEach((x) => {
this[x] = () => this.state = x;
});
}
}
const x = new State(['open', 'closed']);
x.open(); // Property 'open' does not exist on type 'State'.
嗯,我认为TypeScript并不是静态类扩展通用类型的好方法。 我的意思是,以下无效的 TypeScript符合您的要求:
// doesn't work
class Foo<T> extends T {
constructor(obj: T) {
for (const key in obj) {
this[key] = obj[key];
}
}
}
因此,您需要一个诸如 mixin类的类 ,在其中您可以将Foo
扩展为Foo
和T
的构造函数,但又不完全是。 这是我能做的最好的事情:
创建一个具有不同名称_Foo
的类, _Foo
将添加所有特定于Foo
方法和属性。 请注意,您必须断言this
是T
类型,以便为其分配T
的属性:
class _Foo<T> {
constructor(obj: T) {
for (const key in obj) {
// assert this to be compatible with T
(this as any as T)[key] = obj[key];
}
}
// Foo-specific properties and methods go here
}
然后可以将类型Foo<T>
定义为_Foo<T>
和T
,并断言Foo
还是充当Foo<T>
的构造函数的对象:
type Foo<T> = T & _Foo<T>;
const Foo = _Foo as { new <T>(obj: T): Foo<T> };
现在使用它:
const bar = new Foo({
x: 1,
y: 2,
});
bar.x; // okay
那对你有用吗? 可能值得一提的是,此处涉及的困难可能表明您尝试执行的操作可能会通过另一种设计在TypeScript中更好地实现。 例如,也许Foo<T>
应该只是有一个T
,而不是是一个。 然后,您可以以更直接的方式执行此操作。 但这取决于你。
希望能帮助到你; 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.