gpt4 book ai didi

javascript - TypeScript 中的接口(interface)和类

转载 作者:搜寻专家 更新时间:2023-10-30 20:30:56 25 4
gpt4 key购买 nike

在 C# 中,接口(interface)和类之间存在相当大的差异。事实上,一个类代表一个引用类型,因此我们实际上可以创建以该类为模型的对象,而接口(interface)意味着是一个类签署的契约,以确保某种行为的存在。特别是我们不能创建接口(interface)的实例。

接口(interface)的全部意义在于暴露行为。一个类通过给出所述行为的一个显式实现来实现它。

在那种情况下,虽然接口(interface)可能包含属性,但大多数时候我们关心接口(interface)是因为行为问题。因此,大多数类型、接口(interface)只是行为契约。

另一方面,在 TypeScript 上,我似乎有些让我很不安的东西,事实上我不止一次看到过这种情况,这就是这个问题的原因。

在一个教程中我看到了这个:

export interface User {
name: string; // required with minimum 5 chracters
address?: {
street?: string; // required
postcode?: string;
}
}

但等一下。为什么 User 是一个接口(interface)?如果我们像 C# 一样思考,User 不应该是一个接口(interface)。事实上,看起来,我们似乎正在定义数据类型 User,而不是行为契约。

像我们在 C# 中那样思考,很自然的事情会是这样的:

export class User {
public name: string;
public address: Address;
}
export class Address {
public street: string;
public postcode: string;
}

但是像使用类一样使用接口(interface)来定义数据类型,而不是定义行为契约,这在 TypeScript 中似乎非常普遍

那么 TypeScript 中的接口(interface)是指什么?为什么人们在 TypeScript 中使用接口(interface)就像我们在 C# 中使用类一样?接口(interface)应该如何在 TypeScript 中正确使用:建立行为契约,还是定义属性和对象应该具有的?

最佳答案

考虑到在 Javascript 中,数据通常作为普通对象交换,通常通过 JSON:

let data = JSON.parse(someString);

假设这个 data 是一个 User 对象的数组,我们将把它传递给一个函数:

data.forEach(user => foo(user))

foo 会像这样输入:

function foo(user: User) { ... }

但是等等,我们从来没有做new User!我们应该吗?我们是否必须编写一个类 User 并将所有 data map 到它,即使结果完全相同,一个 Object 有属性?不,这只是为了满足类型系统而疯狂,但不会改变运行时的任何内容。一个简单的 interface 描述了特定对象的外观(“行为”)就足够了。

关于javascript - TypeScript 中的接口(interface)和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com