构造函数参数中具有object.assign()属性的TypeScript数据对象类
下面是一个用来用方法扩充数据对象的类构造函数参数中具有object.assign()属性的TypeScript数据对象类,typescript,Typescript,下面是一个用来用方法扩充数据对象的类 export default class ViewModel<T> { constructor(props: T) { Object.assign(this, props); } foo() { console.log('This class and children have methods as well as data'); } } () 如果没有,有没有更好的方法用访问其数据属性的方法包装普通JS对象?
export default class ViewModel<T> {
constructor(props: T) {
Object.assign(this, props);
}
foo() {
console.log('This class and children have methods as well as data');
}
}
()
如果没有,有没有更好的方法用访问其数据属性的方法包装普通JS对象?我不喜欢这个抽象类,在上面的例子中使用UserViewModel
也可以,但是代码库已经有很多不同的T
类型,如果可能的话,我更愿意重复使用它们。(例如,制作UserViewModel
参考User
,而不是复制该类型的大部分定义。)
我知道我也可以将接口与类一起导出,如中所示,但我还希望类中的方法知道
此
TypeScript上可用的值,如果您要扩展或实现的类型没有静态已知的成员,则它不允许您使用类。像T
这样的泛型类型不起作用:
class Foo<T> implements T {} // error!
// A class can only implement an object type or intersection of
// object types with statically known members.
但是您不能使用class
来构建编译器理解为那种泛型类型的构造函数
请注意,在编写class Foo{}
时,您同时引入了名为Foo
的命名类型(对应于类的实例)和名为Foo
的命名值(类的构造函数)
由于我们不能直接使用您的ViewModel
类实现,因此我们将对其进行重命名,然后使用and创建一个名为ViewModel
的类型和值,该类型和值的行为符合您的要求
以下是重命名的类:
class _ViewModel<T> {
constructor(props: T) {
Object.assign(this, props);
}
foo() {
console.log("This class and children have methods as well as data");
}
}
我现在觉得不错。希望有帮助;祝你好运
是否有任何理由不允许视图模型具有道具
?这使得解决方案像m.props.id
一样简单。这是一个预先存在的设计,因此需要对现有代码进行大规模重构。此外,从设计的角度来看,不希望到处都需要.props
来破解类型系统。
type BarConstructor = new <T>(props: T) => T & { foo(): void }; // okay
function makeABarAndDoThings(Bar: BarConstructor) {
const bar = new Bar({ a: 1, b: "2", c: true });
bar.foo(); // okay
bar.a; // okay
bar.b; // okay
bar.c; // okay
}
class _ViewModel<T> {
constructor(props: T) {
Object.assign(this, props);
}
foo() {
console.log("This class and children have methods as well as data");
}
}
type ViewModel<T> = _ViewModel<T> & T;
const ViewModel = _ViewModel as new <T>(props: T) => ViewModel<T>;
type User = { id: number; name: string };
const m = new ViewModel<User>({ id: 1, name: "Alice" });
m.foo(); // fine
console.log(m.id); // also fine