什么用于TypeScript中的纯数据对象:类或接口?

Tit*_*tan 19 javascript typescript

我有一堆只有数据的"类"(在.NET世界中我们称之为POCO对象),它们没有任何方法甚至构造函数.示例是客户,产品,用户实体,您将其命名为......

最初我开始使用typescript类,但现在我认为将它们声明为接口可能会更好.从性能的角度来看,不仅仅是......在C#中,我们习惯使用不同的接口,而对于"POCO"(普通旧clr对象或"仅数据"对象)我们使用只是一个类(有时甚至是结构).

在TypeScript中声明它们的正确方法是什么?

请注意,我主要理解(我认为)类和接口之间的技术差异(即接口是编译时构造),但我试图找出哪种语义符合这种情况.

PS:我见过类似的问题(比如这个),但是没有一个问题清楚明确地解决这个具体问题,所以请不要将其视为'可能重复'或'基于意见'(因为它不是): )

Rya*_*ugh 14

界面,它甚至没有关闭.

人们开始编写TypeScript,他们突然认为他们必须出于某种原因使用类.但他们没有.类是ES6功能,它们工作正常,但如果它只是数据,那只是数据.

使用类的一个主要问题是它们不会像你期望的那样通过网络进行序列化/反序列化,因此instanceof检查之类的东西不起作用.

一条经验法则是,如果没有与某些方法相关联的内部状态,并且不需要传统的OO多态性,请不要使用类.这甚至延伸到static classes - use namespace/ module.


mrt*_*rts 8

使用具有参数属性的类:

// Immutable data object
class Person {
  constructor(readonly firstName: String, readonly lastName: String) {}
}

// Mutable data object
class Person {
  constructor(public firstName: String, public lastName: String) {}
}
Run Code Online (Sandbox Code Playgroud)