提问人:user2342561 提问时间:12/28/2022 更新时间:12/28/2022 访问量:198
TypeScript:基于构造函数参数扩展“this”
TypeScript: extend "this" based on constructor parameters
问:
我正在尝试将类型添加到一个类中,该类在构造函数中扩展了“this”。
我看到了这个问题 Typescript:在类中扩展“this”,但我事先不知道哪个对象会传递给构造函数。
class Baz<T extends object> {
public test;
constructor(props: T) {
Object.assign(this, props);
}
}
interface IFoo {
foo: number;
}
const p = new Baz<IFoo>({foo: 1});
p.test;
p.foo; // Not recognized.
我正在尝试将作为对象传递的字段识别为属性。
答:
1赞
T.J. Crowder
12/28/2022
#1
我不认为你可以用构造函数和泛型类来做到这一点。可以在类上使用泛型类型参数来影响数据成员的类型或方法的参数或返回类型,但不能向类本身添加功能。
不过,您可以使用静态方法(或只是一个独立函数)来完成:
class Baz {
public test: string = "something";
private constructor() { // If you want it to be private; that's up to you
}
static create<T extends object>(props: T): Baz & T {
const b = new Baz();
Object.assign(b, props);
return b as Baz & T;
}
}
interface IFoo {
foo: number;
}
const p = Baz.create<IFoo>({ foo: 1 });
p.test;
p.foo; // <== Works fine
评论
0赞
user2342561
12/28/2022
我正在向现有的 javascript 代码库添加类型。那么唯一的方法就是更改代码?我觉得有点不幸......
0赞
T.J. Crowder
12/28/2022
@user2342561 - 人们在 JavaScript 中使用的某些模式不能很好地映射到 TypeScript 的类型系统。我相当确定这是其中之一。恕我直言,那里的东西在语义上已经不对劲了——代码说,但你得到的不是 ,而是 .我不认为 TypeScript 有办法使用构造函数来表达这一点。所以是的,你要么必须更改代码,要么在你做任何事情的地方使用类型断言(),这似乎需要更多的工作。new Baz
Baz
Baz + ____
new Baz(/*...*/) as Baz & ____
评论
test
test
foo
)