当前位置: 首页 > 知识库问答 >
问题:

何时在TS中使用类型(vs接口)[重复]

经骁
2023-03-14

我无法确定您何时(如果有的话)想要在typescript中为变量使用类型而不是接口。假设以下两种情况:

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

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

我可以用两个变量定义一个完全相同的wasconstuser:user= 。但是,以下是我可以用接口做的所有我不能用类型做的事情:

// 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) {
        ...
    }
}

仅举几个例子。

所以我的问题是:你什么时候会想要使用类型


共有1个答案

宇文鸣
2023-03-14

编辑(12/15/2020):在底部,我添加了TS中“类型”的信息(或另一种语言中的等效概念)。

除非我弄错了,否则您并不完全清楚接口和类型的目的是什么。

在OOP术语中,接口没有实现。类型可以。所以接口基本上是无用的,除非一个类型实现了它。此外,一个类型只能扩展另一个类型。但是它可以实现很多接口。

但那是什么意思...

假设你有一辆车和一个用户。非常不同的类型,你不会立即认为在任何实际的方式是相同的。有些人可能会说,“你应该创建ICar和IUser”。但实际上,这并不是一种考虑接口的实用方法。对于用户来说,实现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... );
}

这些对象的数组是(想想如果没有接口,你还会怎么做):

Array<ISelfDescribable>

现在您(以及查看代码的任何其他开发人员)知道了一个事实,该数组中的任何对象,无论具体类型如何,都实现了iselfdesibable的“行为”。如果你仔细想想,你真的不需要知道一个类型是什么,除非你在实现它,你只关心它的行为。但是您仍然需要类型来实现该行为。

比如说有一天你想让这两件物品都“保险”。它们都应该有一个方法,“setInsurancePolicy”。您可以创建IInsurable{setInsurancePolicy(policy:policy)},并在类型中实现它。现在您有了ISelfDescribableIInsurable的对象,您可以将这些对象的数组键入其中一个。

所以对我来说,当我开始思考这个问题时,我的大灯泡熄灭了:类型(和类型层次结构)应该关注具体的事情。接口应该关注可以在不同类型之间共享的行为。还有更多,但这至少给出了选择接口或类型的概念。它们在编程方面代表不同的事物,即使它们在其他方面看起来是相同的。

(补充:像Scala这样的语言不会以这种方式考虑接口。它们确实有“行为”的概念,但你也可以实现行为,并覆盖它们。对于这个特定的问题,这可能是太多的学术废话了,但嘿,我需要杀死地牢中的所有怪物,而不仅仅是为了任务)。

2020年12月15日:类型脚本:类型与接口。

为什么要用其中一个呢?同样,它关系到您希望它代表什么以及您希望如何准确地使用它。

“类型”是“我需要一个契约,但它不像接口那样是一个行为定义”的答案。

这允许您在语义上保持区分。这是一个接口,因为它定义了一个水平行为。这是一种类型,因为它定义了...一种类型。

尽管如此,类型在某种程度上是功能友好的,而接口则不是,因为您可以组合和相交类型。例如,在React中,我听到它说,“永远不要使用接口,因为它们远不如类型那样可组合。”

假设你有两个服务调用,你想为有效载荷定义一个契约。接口?不...那是水平行为。但是“类型”,是的...它类型有效载荷,但不在语义上定义行为。

而且,假设您遇到了必须将两个有效负载类型的定义合并为一个的常见任务(对于用户界面组件或其他东西)。使用“类型”定义,语言使这种联合/交集/etc变得简单明了。

因此,逻辑仍在继续;接口、水平行为、类型、垂直定义,可通过多种方式组合。

 类似资料:
  • 我见过类似这样的相关问题,但它们都假设类和接口的区别在于类可以实例化,而接口不能。然而,以@types/google.maps为例,例如: 接口和类: 延伸其他对象 具有属性 具有方法/功能 无法从这些定义直接实例化 在google maps代码中的某个地方,实际上有一个类用于这里定义的< code >类和这里定义的< code >接口。看起来类定义是用户可以实例化的,而不是库可以内部实例化的(接

  • 问题内容: 我在该站点上阅读了很多有关常量用法的文章。 问题:什么时候应该使用Enums作为常量,而不是使用类或接口。 我看到了两个我要解决的关键情况。 1.多个项目在应用程序中使用的全局常数。 例: 常用日志字符串 容器引用,例如WebSphere EAR的数据库映射引用 2.对象特定常量 例: 员工对象的员工工资率 从我阅读的所有内容中,我认为我已经掌握了这些内容,并且正在寻找自己的看法。 对

  • 我知道和之间的区别,它们分别针对元素和元素的迭代器。 我什么时候应该用哪个?如果开销是相似的,为什么我要使用,因为更容易编写?

  • 假设我想创建一个字典,例如,一个或多个车型的汽车品牌。 在ES6中,我似乎可以用两种不同的方式做到这一点。 1.创建对象映射: 代码: 2.创建ES6 Map实例: 代码: 以上两种方法的主要区别和优缺点是什么?

  • 由于Java9将允许我们在接口中也定义和方法,那么和中剩下的区别是什么呢?而且,Java走向多重继承的步伐是不是很慢?