打字稿

时间:2016-08-03 09:07:35

标签: typescript

我正在学习TypeScript。我来自一种强类型语言(c#),并且在JS中有一些知识。

一开始我摔倒了下面的例子:

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

现在我有点困惑。我希望像Student:Person(c#)或Student implements Person(Java)这样的东西 那么:为什么greeter()接受了一个类的对象" Student"?我没有看到任何线索" Student"实现" Person"。

它只是属性名称? 所以,如果我添加另一个类

class Teacher {
  salaray:int,
  firstName:string,
  lastName:string
}

该类的对象也是greeter()的有效参数?

2 个答案:

答案 0 :(得分:2)

是的,你是正确的,编译器检查传递给greeter的对象是否满足Person接口,并且因为Student类包含所有所需的属性然后编译器对此感到高兴。

是的,你可以这样做:

class Teacher {
    salaray: number;
    firstName:string;
    lastName:string;
}

document.body.innerHTML = greeter(new Teacher());

code in playground

答案 1 :(得分:1)

是的,你对自己的假设是正确的。您可以看到打字稿转化为的代码。您发布的代码(我将最后一行更改为警报)看起来像这样

var Student = (function () {
    function Student(firstName, middleInitial, lastName) {
        this.firstName = firstName;
        this.middleInitial = middleInitial;
        this.lastName = lastName;
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
    return Student;
}());

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

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

一旦打字稿被转换为javascript,那些对这些接口和类的了解就会丢失。您可以从上面的转换示例中看到。在这个例子中,有意义的是它可以正确运行,因为传入的变量person实际上确实具有该方法正在访问的属性。因此,Typescript可以看到代码的转换版本确实有意义并且不会抱怨它。