【问题标题】:Why does TypeScript programmers prefer interface over type为什么 TypeScript 程序员更喜欢接口而不是类型
【发布时间】:2020-06-24 17:58:31
【问题描述】:

我看到很多 TypeScript 开发人员过度使用界面。事实上,即使他们的代码比面向对象的代码更实用,他们也几乎将它用于所有事情。我个人更喜欢type,它更灵活,并且不会混淆接口是由任何类实现还是仅用于定义对象类型。 使用interface 比使用type 有什么优势,还是开发人员习惯做的某种遗留问题?

【问题讨论】:

  • 即使他们的代码比面向对象的代码更实用interface 本质上不是其中任何一个。 “[type]不会混淆接口是否由任何类实现”让我明确一点,这是您的期望。不是每个 TypeScript 程序员的期望。对来说,接口不以任何方式绑定到类。类型系统和类系统是不同的东西。函数式程序员应该明白这一点,因为 Haskell 等具有类型系统。 interface 定义了结构期望,而不是继承链。

标签: typescript


【解决方案1】:

type 的预期用途是aliasing of types,尤其是交集/联合类型。

它们不应该像文档所述的那样用作接口:

正如我们所提到的,类型别名可以起到类似接口的作用。但是,有一些细微的差别。

一个区别是接口创建了一个在任何地方都可以使用的新名称。类型别名不会创建新名称——例如,错误消息不会使用别名。在下面的代码中,在编辑器中将鼠标悬停在interfaced 上会显示它返回Interface,但会显示aliased 返回对象字面量类型。

type Alias = { num: number }
interface Interface {
    num: number;
}
declare function aliased(arg: Alias): Alias;
declare function interfaced(arg: Interface): Interface;

【讨论】:

    【解决方案2】:

    interface 表示实体应该是什么;特别是对象。

    接口不仅存在于Typescript中,Java、C++中也有……语法不同但含义相同。

    国际海事组织:

    interface 是您在描述对象/类应该是什么时应该使用的。

    type 在其他人手中应该被视为别名制造者。

    【讨论】:

    • 更正interface 不仅仅适用于对象。你可以有一个函数的接口。是的,“函数是对象”,除了函数接口和对象接口之外的所有东西肯定是不同的,不能互换,也不能在任何方向上互换。对于对象,接口描述形状(预期的属性和值),而对于函数,接口描述签名(预期的输入和输出)。
    • 您说的很中肯,我的句子specifically objects 不够清楚。对于函数的想法,你宁愿使用type关键字,因为通常你会做type MyFunc = (foo:string) => void:之类的东西,这就是为什么我说接口是专门为对象/类制作的。
    • @VLAZ 我不知道这种语法。有趣的!它是使用 function 关键字工作还是使用函数是对象这一事实的解决方法?
    • 这是interface 的另一种语法。它与作为对象的函数完全无关——它只是一个重载的实现。老实说,这有点烦人,但我想这样做是为了有一种规范的方式来处理函数接口和结构接口。它本来可以很容易地改成signature Add。不幸的是,函数接口/签名不适用于注释函数声明。充其量,你可以做函数表达式,比如箭头函数或myFn: Add = function() {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2011-03-24
    相关资源
    最近更新 更多