【问题标题】:Why do Typescript classes implement interfaces automatically?为什么 Typescript 类会自动实现接口?
【发布时间】:2016-11-30 09:25:03
【问题描述】:

所以我在没有任何 JS 经验的情况下完成了 Typescript 教程。我的问题是在给定的示例代码中,为什么可以将 Student 对象传递给以 Person 作为参数的 greeter() 函数? Student 类从不实现所述接口,所以我想知道 Typescript 类中是否自动实现接口。如果他们这样做了,这背后的原因是什么?如果 Car、Plane 和 Student 都自动实现 Person,这似乎没什么用。

class Student {
    fullName: string;
    constructor(public firstName, public middleInitial, public lastName) {
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person : Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

var user = new Student("Jane", "M.", "User");

document.body.innerHTML = greeter(user);

【问题讨论】:

  • 回答简短的回答:是的
  • 这样做的目的是什么?所以每一堂课——f.ex。汽车、飞机、帐户——我将在此文件中声明将实现人???我也可以完全删除接口并将其包含在类中
  • 您仍然必须拥有与接口声明相同的字段(相同类型)!除非您的飞机有名字和姓氏,否则它不会被视为有效人员
  • Typescript 接口是在结构上实现的,因此类只有在具有 firstNamelastName 类型为 string 的属性时才实现 Person
  • 参数名前面的public关键字将它们变成了字段。缺少类型注释意味着它们的类型为anyany 类型的字段与任何其他类型兼容。

标签: class typescript interface


【解决方案1】:

typescript 中的接口是一个纯粹的抽象概念 在真正的javascript世界中,它没有界面概念。 你用 typescript 写的界面不会被翻译成 javascript

因此,对于接口,它不必真正实现它,只需要保持相同的形状即可。 官方解释可以在这里找到 https://www.typescriptlang.org/docs/handbook/type-compatibility.html

【讨论】:

    【解决方案2】:

    这称为Structural Typing。本质上,TypeScript 中的类型之间的关系从不需要显式声明(“命名”,如在名义类型中,如 C#、Java 和朋友),它们纯粹是通过分析所涉及类型的结构来完成的。

    在 TypeScript 中,当你说一个类实现了一个接口时,你实际上并没有改变这个类,或者所涉及的子类的类型,你只是要求编译器确认它确实已经实现了界面。

    至于推理,这里的关键因素(与 TypeScript 中的许多决定一样)是这更接近于 JavaScript 在实践中所做的事情(即duck typing - 如果你传递了正确的形状,它会起作用) ,因此更容易兼容现有的 JavaScript 代码。

    值得注意的是,这确实给 TypeScript 留下了一些限制。例如,您不能像在 Java 中那样使用与 marker interfaces 相同但不兼容的类型来限制输入。在 Java 中,SerializableCloneable 可克隆是两个空接口,可以实现它们以将类型标记为可序列化或可克隆,然后方法只能接受 Serializable 参数以确保它们仅获取明确已知是安全的类序列化。在 TypeScript 中,你不能这样做:空接口不会改变对象的结构,因此对类型系统没有任何影响。

    【讨论】:

    • 您描述的“标记接口”已经是一种解决方法,不是吗?这不是接口概念的用途。 (空接口几乎应该是编译器错误。)我读到 typescript 最终将支持装饰器,这可能是这样做的更好方法。
    • FWIW,Go-lang 对接口做了类似的事情:实际的类(可能是第 3 方!!!)不需要实现您的接口,但该语言仍然允许您创建接口并检查日常对象具有所需的方法/功能。即使旧的第 3 方对象不知道您需要它的“justDoIt(now)”方法。
    • 结构类型是我最喜欢的 Go 功能之一,刚刚开始使用 typescript,我很高兴他们使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2019-06-27
    • 2014-09-16
    • 2021-07-20
    • 2012-01-18
    • 2018-07-19
    • 2020-06-04
    相关资源
    最近更新 更多