我刚刚开始学习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
答案 0 :(得分:2)
为什么签名不匹配没有编译器错误?
由于Javascript具有极强的动态性,TypeScript对于鸭子打字非常宽容。您的greeter
函数接受Person
,但它实际上等同于具有firstname: string
和lastname: 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;
|
| }