【发布时间】:2021-08-02 23:22:36
【问题描述】:
考虑以下类:
class Person {
name: string = 'Shachar';
age: number = 22;
printPerson() {
console.log(`name: ${this.name}, age: ${this.age}`);
}
}
有没有办法获得一个具有此类实例“拥有”的属性的接口?
在这个例子中,我只想要属性name 和age,因为printPerson 最终会成为任何实例原型的一部分,而不是自己的属性。
要求明确输入“姓名”和“年龄”的解决方案是不可接受的,因为该类可能有很多属性,我只想写一次。
【问题讨论】:
-
TS 不区分自己的和继承的属性。
-
@VLAZ 这有什么好的技术原因吗?还是理论上可以实现?
-
技术原因是TS在结构上比较接口。如果一个对象匹配一个接口而没有明确声明为该接口,它仍然可以分配给它。这有助于与不存在接口的基本 JS 代码兼容。 JS 编程通常通过与接口的工作方式类似的合同来完成,但没有接口来更正式地绑定它。只要对象具有
foo属性,就会使用很多鸭子类型,这可能就足够了。由于对象的动态特性,限制foo出现的位置和方式也没有任何意义。 -
理论上 - 您可以从
Person创建一个映射类型,排除所有作为函数的属性。但是,这不仅会删除原型方法,还会删除分配有函数的实例属性。
标签: typescript