【问题标题】:Get an interface of own properties from a class in TypeScript从 TypeScript 中的类获取自身属性的接口
【发布时间】:2021-08-02 23:22:36
【问题描述】:

考虑以下类:

class Person {
  name: string = 'Shachar';
  age: number = 22;
  
  printPerson() {
    console.log(`name: ${this.name}, age: ${this.age}`);
  }
}

有没有办法获得一个具有此类实例“拥有”的属性的接口? 在这个例子中,我只想要属性nameage,因为printPerson 最终会成为任何实例原型的一部分,而不是自己的属性。

要求明确输入“姓名”和“年龄”的解决方案是不可接受的,因为该类可能有很多属性,我只想写一次。

【问题讨论】:

  • TS 不区分自己的和继承的属性。
  • @VLAZ 这有什么好的技术原因吗?还是理论上可以实现?
  • 技术原因是TS在结构上比较接口。如果一个对象匹配一个接口而没有明确声明为该接口,它仍然可以分配给它。这有助于与不存在接口的基本 JS 代码兼容。 JS 编程通常通过与接口的工作方式类似的合同来完成,但没有接口来更正式地绑定它。只要对象具有foo 属性,就会使用很多鸭子类型,这可能就足够了。由于对象的动态特性,限制foo 出现的位置和方式也没有任何意义。
  • 理论上 - 您可以Person 创建一个映射类型,排除所有作为函数的属性。但是,这不仅会删除原型方法,还会删除分配有函数的实例属性。

标签: typescript


【解决方案1】:

感觉应该有一个更好的答案,也许有,但作为一种解决方法,您可以将您的示例类分成两个单独的类 - 一个包含您的属性,一个包含您的方法?例如:

class PersonProperties {
    name: string = 'Shachar';
    age: number = 22;
}

class Person extends PersonProperties {
    printPerson() {
        console.log(`name: ${this.name}, age: ${this.age}`);
    }
}

然后,您可以利用 PersonProperties 的隐式接口或创建一个您认为合适的自定义接口,例如

interface IPersonProperties extends PersonProperties {};

var x:IPersonProperties = {
    age: 500000,
    name: ""
}

也许不理想,但应该可以。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2021-06-28
    • 2021-01-18
    • 2020-02-28
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多