打字稿人界面学生班级关系

时间:2016-03-22 09:57:31

标签: typescript

我刚刚开始学习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);

谢谢, Gourav

2 个答案:

答案 0 :(得分:2)

  

为什么签名不匹配没有编译器错误?

由于Javascript具有极强的动态性,TypeScript对于鸭子打字非常宽容。您的greeter函数接受Person,但它实际上等同于具有firstname: stringlastname: string属性的对象。

对于编译器,如果给定对象是指定类的实际实例,指定接口的实现,或者只是具有相同属性的对象文字,则无关紧要。

以下是greeter函数的所有有效用法。对象文字直接作为参数传递:

greeter({
    firstname: "John",
    lastname: "White"
});

使用object literal初始化的接口类型变量,然后作为参数传递:

var somebody: Person;

somebody = {
    firstname: "John",
    lastname: "White"
};

greeter(somebody);

至于Student及其接受的原因:使用构造函数中的public关键字,您可以自动初始化对象实例上的相应属性。它实际上是一个简写:

class Student {
    fullname : string;

    public firstname: string;
    public middleinitial: string;
    public lastname: string;

    constructor(firstname: string, middleinitial: string, lastname: string) {
        this.firstname = firstname;
        this.middleinitial = middleinitial;
        this.lastname = lastname;
    }
}

由于Student类现在具有firstname和lastname属性,并且它们都是字符串,因此Student类满足Person接口的要求。明确指定Student implements Person

可能是个好主意

答案 1 :(得分:0)

class Student {
    fullname : string;
    constructor(public firstname, public middleinitial, public lastname) {
    ..//

类似于“之后”

class Student {

        fullname : string;

        public firstname     ....// 
        public middleinitial ....// 
        public lastname      ....//

        constructor(public firstname, public middleinitial, public lastname) 

制作时

var user = new Student("Jane", "M.", "User");
在这种情况下,

user推断类型string

class Student {

        fullname : string;

        public firstname     : string ....// 
        public middleinitial : string ....// 
        public lastname      : string ....//

和你的interfarce:

interface Person {
    firstname: string;
    lastname: string;
}

当你说:

function greeter(person : Person)

您必须通过符合界面要求的最低要求。

现在你做了类似greeter(user);用户的事情。它有额外的信息,所以它可以工作。

class Student {                                 | interface Person {
                                                |
        fullname : string;                      |
                                                |
        public firstname     : string = "Jane"; ->   firstname: string;
        public middleinitial : string = "M.";   |
        public lastname      : string = "User"; ->   lastname: string;
                                                |   
                                                |   }