【发布时间】:2023-03-16 16:12:01
【问题描述】:
这是一个被构造为使用方法来扩充数据对象的类。
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');
}
}
是否可以让 TypeScript 理解 T 的所有 props 都存在于 ViewModel<T> 的实例上?
type User = { id: number; name: string };
const m = new ViewModel<User>({ id: 1, name: 'Alice' });
m.foo(); // fine
console.log(m.id); // Property 'id' does not exist
如果没有,有没有更好的方法来包装一个普通的 JS 对象,其中包含访问其数据属性的方法?我没有附加到这个抽象类,在上述情况下使用UserViewModel 会很好,但是代码库已经有许多不同的T 类型,如果可能的话,我更愿意重新使用它们。 (例如,使 UserViewModel 引用 User 而不是复制该类型的大部分定义。)
我知道我还可以将接口与类一起导出,例如在 Extending `this` in Typescript class by Object.assign 中,但我还希望类中的方法知道 this 上可用的值。
【问题讨论】:
-
有什么理由不能让视图模型拥有
props?这使得解决方案像m.props.id一样简单。 -
这是一个预先存在的设计,因此需要对现有代码进行大量重构。但另外,从设计的角度来看,要求
.props在任何地方破解类型系统是不可取的。
标签: typescript