我正在学习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()
的有效参数?
答案 0 :(得分:2)
是的,你是正确的,编译器检查传递给greeter
的对象是否满足Person
接口,并且因为Student
类包含所有所需的属性然后编译器对此感到高兴。
是的,你可以这样做:
class Teacher {
salaray: number;
firstName:string;
lastName:string;
}
document.body.innerHTML = greeter(new Teacher());
答案 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可以看到代码的转换版本确实有意义并且不会抱怨它。