Class 为什么Typescript类自动实现接口?

Class 为什么Typescript类自动实现接口?,class,typescript,interface,Class,Typescript,Interface,所以我在没有任何JS经验的情况下完成了Typescript教程。我的问题是在给定的示例代码中,为什么可以将Student对象传递到以Person为参数的greeter()函数中?这个学生从来没有实现过这个接口,所以我想知道Typescript类是否会自动实现接口。如果他们这样做了,背后的原因是什么?如果汽车、飞机和学生都能自动实现人,那就没什么用了 class Student { fullName: string; constructor(public firstName, pu

所以我在没有任何JS经验的情况下完成了Typescript教程。我的问题是在给定的示例代码中,为什么可以将Student对象传递到以Person为参数的greeter()函数中?这个学生从来没有实现过这个接口,所以我想知道Typescript类是否会自动实现接口。如果他们这样做了,背后的原因是什么?如果汽车、飞机和学生都能自动实现人,那就没什么用了

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);

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

所以,对于接口,它不需要真正实现它,只需要保持相同的形状。 官方解释可以在这里找到 这就是所谓的。本质上,TypeScript中类型之间的关系不需要显式声明(“命名”,如C#、Java和friends等名义类型),它们完全是通过分析所涉及类型的结构来完成的

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

至于推理,这里的关键因素(与TypeScript中的许多决策一样)是,这与JavaScript在实践中的功能更为匹配(即,如果您传递了正确的形状,它就会工作),因此与现有JavaScript代码的兼容性要容易得多


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

答案:是的,这是为了什么?因此,每一个类-f.ex。汽车,飞机,帐户-我会在这个文件中声明将实施人???我还可以完全删除接口并将其包含在类中,然后您仍然必须拥有与接口声明相同的字段(相同类型)!除非你的飞机有名字和姓氏,它不会被视为有效的PersonTypescript接口,因为它是在结构上实现的,因此如果类具有
名字
姓氏
类型属性
字符串
,则类仅实现
。参数名称前面的
公共关键字将它们转换为字段。缺少类型注释意味着它们属于类型
any
;类型为
any
的字段与任何其他类型的字段兼容。不过,您描述的“标记接口”已经是一种解决方法了,不是吗?这不是接口概念的目的。(一个空接口几乎应该是一个编译器错误。)我听说typescript最终会支持decorators,这可能是更好的方法。FWIW,Go lang对接口做了类似的事情:实现接口不需要实际的类(可能是第三方!!!),但是该语言仍然允许您创建一个接口,并检查当天的对象是否具有所需的方法/功能。甚至当一个旧的第三方对象不知道你需要它的“justDoIt(now)”方法时。结构类型是我最喜欢的Go功能之一,刚刚开始使用typescript,我很高兴他们使用了它