javascript - 将方法的参数声明为接口类型,并将不相关的对象传递给它
问题描述
我正在创建一个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);
它应该给出一个错误
期待一个人,但得到了一个学生
但实际上它打印得很好。
解决方案
您没有收到错误的原因是您的Student
类通过使用关键字隐式声明firstName
,middleName
和lastName
属性。public
事实上,构造函数参数上的任何修饰符都会导致相应成员的自动声明和初始化。因此,Student
可以直接赋值给Person
。
IMO 对于那些不太熟悉该语言的人来说,这是一个令人困惑的结构,我个人更喜欢明确。如果您使用的是 TSLint,则可以使用no-parameter-properties
.
如果您想保持这些属性不变但确保Student
不可分配给Person
,则需要添加另一个属性以Person
使其不兼容,即isPerson: true;
.
推荐阅读
- android-studio - 带有 NDK 的 Android Studio:链接错误:未定义对“stderr”的引用
- amazon-web-services - iptables 转发连接超时
- java - 由于字符串格式在 android 中进行 http 调用的问题 - 索引 81 处的查询中的非法字符
- azure - 如何为 Azure VM 附加 OSDisk 和更改 OSProfile
- swift - 使用 multipartFormData 上传图像时 Alamofire 请求正文为零
- docker - Docker 容器无法打开密钥库
- julia - 如何正确读取`@code_warntype`的输出?
- ios - 如何在 iOS 中使用 XCode 9 自定义导航栏
- ruby-on-rails - 登录后如何对“current_user_sign_in_ip”进行地理编码
- javascript - 如何定位 iframe 中没有 Id 或 Class 属性的元素?