我正在使用打字稿。我想知道如何动态设置对象的属性,以便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'.
答案 0 :(得分:1)
嗯,我不认为TypeScript有一种很好的方法可以让静态类扩展泛型类型。我的意思是,以下无效的 TypeScript是您要求的:
dd/mm/yyyy
所以你想要喜欢 mixin class,你可以将// doesn't work
class Foo<T> extends T {
constructor(obj: T) {
for (const key in obj) {
this[key] = obj[key];
}
}
}
扩展为Foo
和Foo
的构造函数...但不完全一样。这是我能做的最好的事情:
创建一个名称不同的类T
,该类添加了所有_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
也是一个对象,它充当{{1}的构造函数}}:
Foo
现在使用它:
Foo<T>
这对你有用吗?值得一提的是,这里涉及的困难可能表明,您尝试做的事情可能会通过另一种设计在TypeScript中实现。例如,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
,而不是 一个。然后你可以更直接的方式做到这一点。但这取决于你。
希望它有所帮助;祝你好运!