gpt4 book ai didi

javascript - 何时在 TS 中使用类型(与接口(interface))

转载 作者:可可西里 更新时间:2023-11-01 02:33:34 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Interfaces vs Types in TypeScript

(24 个回答)


5年前关闭。




我无法确定何时(如果有的话)您想要使用 type而不是 interface对于 typescript 中的变量。假设以下两个:

type User = {
id: string;
name: string;
type: string;
}

interface User {
id: string;
name: string;
type: string;
}

我可以定义一个完全一样的变量是 const user: User = ... .然而,这里是我可以用 interface 做的所有事情。我不能用 types :
// Extension:
interface AdminUser extends User {
permissions: string[];
role: string;
}

// Using in abstract method:
abstract class Home {
abstract login(user: User): void;
}

class AdminHome extends Home {
login(user: AdminUser) {
...
}
}

仅举几个。

所以我的问题是:你什么时候想使用 type ?

最佳答案

EDIT (12/15/2020): At the bottom, I've added info on "types" in TS (or the equivalent idea in another language).


除非我弄错了,否则您并不完全清楚接口(interface)与类型的目的是什么。
在 OOP 术语中,接口(interface)没有实现。类型可以。因此,除非类型实现了接口(interface),否则接口(interface)基本上是无用的。此外,一种类型只能扩展另一种类型。但它可以实现很多接口(interface)。
但这是什么意思...
假设您有汽车和用户。非常不同的类型,您不会立即认为它们在任何实际操作中都是相同的。有人可能会说,“好吧,你应该创建 ICar 和 IUser”。但实际上,这并不是考虑接口(interface)的实用方法。用户实现 ICar 会令人困惑,和/或 ICar 似乎与 Car 做同样的事情。另一个程序员查看代码会有什么不同?
假设您希望他们都成为(再次只是为了它),“自我描述”,并且您希望他们都以相同的方式提供信息。所以你会创建:
ISelfDescribable {
getSelfDescription ( );
}
现在,你会这样做:
Car implements ISelfDescribable {
getSelfDescription ( return "I am a car!" );
}

User implements ISelfDescribable {
getSelfDescription ( return ...some other completely different way of getting the info... );
}
这些对象的数组将是(考虑在没有接口(interface)的情况下如何做到这一点):
Array<ISelfDescribable>
现在你(和任何其他查看代码的开发人员)知道一个事实,这个数组中的任何对象,无论具体类型如何,都实现了 ISelfDesribable 的“行为”。 .如果您考虑一下,除非您正在实现它,否则实际上不需要知道类型是什么,您只关心行为。但是您仍然需要类型来实现该行为。
假设有一天您希望这两个对象都是“可保的”。他们都应该有一个方法, "setInsurancePolicy" .您可以创建 IInsurable { setInsurancePolicy ( policy : Policy ) } ,并在类型中实现它。现在你有两个都是 ISelfDescribable 的对象。和 IInsurable ,并且您可以将这些对象的数组键入为任一对象。
所以对我来说,当我意识到这一点时,大灯泡熄灭了: 类型(和类型层次结构)应该关注具体的事情。接口(interface)应该关注可以在不同类型之间共享的行为。 它还有更多内容,但这至少给出了您为什么选择接口(interface)或类型的概念。它们在编程方面代表不同的事物,即使它们在其他方面看起来相同。
(附录:像 Scala 这样的语言不会以这种方式考虑接口(interface)。它们确实有“行为”的概念,但您也可以实现行为并覆盖它们。对于这个特定问题,这可能是太多的学术废话,但是,嘿,我需要杀死地牢中的所有怪物,而不仅仅是那些用于任务的怪物)。
2020 年 12 月 15 日:TypeScript:类型与接口(interface)。
为什么要使用其中一个?同样,它与您希望它代表什么以及您希望如何使用它有关。
“类型”是“我需要一个契约(Contract),但它不是像接口(interface)这样的行为定义”的答案。
这使您可以在语义上保持差异化。这是一个接口(interface),因为它定义了一个水平行为。这是一种类型,因为它定义了……一种类型。
不过,沿着这条线,类型在功能上是友好的,而接口(interface)则不是,因为您可以组合和相交类型。例如,在 React 中,我听说它说:“永远不要使用接口(interface),因为它们远不如类型可组合。”
假设您有两个服务调用,并且您想为有效负载定义一个契约(Contract)。界面?不...这是横向行为。但是“类型”,是的……它键入有效负载,但没有在语义上定义行为。
并且,假设您遇到了必须将两种有效负载类型的定义合并为一个的常见任务(对于 UI 组件或其他东西)。使用“类型”定义,该语言使这种联合/交集/等变得简单。
所以逻辑仍然存在;接口(interface)、水平行为、类型、可以以多种方式组合的垂直定义。

关于javascript - 何时在 TS 中使用类型(与接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41682572/

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