首页 > 解决方案 > 将方法的参数声明为接口类型,并将不相关的对象传递给它

问题描述

我正在创建一个person接口并创建了一个方法,该方法greeter接受person并打印它的名字和姓氏。然后我创建了一个student有名字和姓氏的类。创建了一个对象student并传递给greeter函数,它可以工作。

class Student{
    fullName: string;
    constructor(public firstName: string, public middleName: string ,public lastName: string)
    {
        this.fullName=firstName+" "+ middleName+" "+lastName;
    }
}
interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person: Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}
let user =new Student("jane","doe","user");
document.body.textContent = greeter(user);

它应该给出一个错误

期待一个人,但得到了一个学生

但实际上它打印得很好。

标签: javascripttypescript

解决方案


您没有收到错误的原因是您的Student类通过使用关键字隐式声明firstName,middleNamelastName属性。public事实上,构造函数参数上的任何修饰符都会导致相应成员的自动声明和初始化。因此,Student可以直接赋值给Person

IMO 对于那些不太熟悉该语言的人来说,这是一个令人困惑的结构,我个人更喜欢明确。如果您使用的是 TSLint,则可以使用no-parameter-properties.

如果您想保持这些属性不变但确保Student不可分配给Person,则需要添加另一个属性以Person使其不兼容,即isPerson: true;.


推荐阅读