在打字稿中,
当我想创建模型类时,有两个选择。我使用属性创建一个Interface
或使用公共变量创建一个Class
。
它们两个都可以工作。我只能看到的区别是,我可以在class
中提供默认值。
那哪种方法更好呢?
答案 0 :(得分:1)
取决于,是一种数据类型,是一种数据,接口有点像契约。它会具有某种逻辑吗?就像要说要基于名字和姓氏来建立全名一样,它还会有其他逻辑吗?如果需要这些,则需要上一堂课。
但是,如果这些只是数据类型,并且特别是来自API,那么您甚至不需要初始化它,它们应该是接口。就像您要根据请求通过有线发送此数据一样,它应该是一个接口。
答案 1 :(得分:1)
往往只是属性包的模型类是一种反模式。最好将数据连同对该数据(行为)进行操作的逻辑一起封装在同一构造中。因此,上课是一个更好的选择。
例如,如果模型类具有Email属性,则最好在模型类的setter方法中验证电子邮件格式。
答案 2 :(得分:0)
这实际上取决于您的实现,如果您只是将其用作数据结构,我建议使用一个接口,因为它允许从网络请求进行转换或通过JSON对象进行创建,而如果您实现了一个类,则不可能。像这样:
const myModel: MyModelInterface = {
key: 'value',
key: 'value'
}
或
async function getData(){
const response = await fetch('http://myurl.com');
const result = await response.json();
const castResult = result as MyModelInterface;
}
但是,类是利用构造函数的复杂数据结构,并且可以具有方法实现,因此,如果您应该将某些方法附加到数据结构上,则可以使用类。像这样:
class Model {
value: number;
constructor(value: number) {
this.value = value;
}
increment(): void {
this.value++;
}
}
const model = new Model(0);
model.increment()
此article可用于获取更多信息
答案 3 :(得分:0)
以下答案确实适用于使用界面的任何语言。
因此,接口从域的角度定义了行为,因此您可能希望将其视为一个抽象层,该抽象层过滤掉不需要的细节,并将用法绑定到行为模型而不是实例或类类型,例如:
You have a very business heavy logic class that takes a request to process ticketing for a commute from location A to B.
You need to model (create class) a **car**, the current domain (understanding of usage) goes like
“我需要知道汽车的占用率和最大速度,因为我正在用它来预订车票以填补并确定行车时间。”
此时,您已经了解到汽车可能会抽象到车辆,您无需担心颜色,发动机排量或其他细节。
因此,将来可以扩展该域以添加火车,飞机,轮船和人力车(实现车辆界面的类)。
您所关心的只是从您的域角度来看的行为,即运输,然后您获得了额外的好处,即您在票证和汽车之间没有硬性依赖,并且更容易通过模拟行为进行测试针对界面。
请给我您正在使用接口的域,以便我为之定制答案。
答案 4 :(得分:0)
不要让尝试进入面向对象编程的答案感到困惑,在Typescript中,这些实际上是唯一的区别。
接口编译为零代码,在打字稿游乐场中插入一个接口,并查看其输出为零。
将类编译为运行时代码,在打字稿操场中查看输出,并将其包含所有运行时级别逻辑以构造自身。
类和接口都是类型,并且接口本质上可以用来模仿类,但是本质上是不同的。
一个是形状。 一个是形状可构造。
(用于模仿打字稿中的类的接口示例)
interface Foo {
new(name: string, age: number): Foo;
age: number;
name: string;
}
答案 5 :(得分:0)
让我们这样说。
您的TypeScript代码最终将被转换为某些JavaScript代码。
TypeScript接口只是一个契约-它仅定义此接口对象可以具有的属性和功能。这是编译时的事情,不会影响您从TypeScript代码获得的JavaScript代码结果。
一个类-是真实的东西,在编译时会被转换成一些JavaScript代码(具有原型定义的函数或现代的ES6类)。