Typescript什么是更好的方法类或接口

时间:2019-05-17 05:24:05

标签: typescript

在打字稿中,

当我想创建模型类时,有两个选择。我使用属性创建一个Interface或使用公共变量创建一个Class

它们两个都可以工作。我只能看到的区别是,我可以在class中提供默认值。

那哪种方法更好呢?

6 个答案:

答案 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类)。