Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造函数参数中具有object.assign()属性的TypeScript数据对象类_Typescript - Fatal编程技术网

构造函数参数中具有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