【问题标题】:Get class (interface) properties in Angular 5 / TypeScript without assigning a default value在 Angular 5 / TypeScript 中获取类(接口)属性而不分配默认值
【发布时间】:2018-03-08 13:48:01
【问题描述】:

假设我有一个接口 A,我按照 Angular 样式指南将其声明为一个类。这个类有很多属性,我想获取它们的名称而不必为它们分配任何值。我怎样才能做到这一点?

A 类:

export class A {
  property1: string;
  property2: string;
  ...
  property30: string;
}

我尝试从这个类实例化一个新对象并调用Object.keysObject.getOwnPropertyNames 但这两个方法返回一个空数组,因为它们忽略了未定义的值属性。有没有办法绕过这种行为?还是我打破了 JavaScript/TypeScript 模式? :D

【问题讨论】:

标签: javascript angular typescript


【解决方案1】:

属性声明的工作方式是它们只是向编译器提示该属性可能在运行时存在。在 JavaScript 中,您不需要声明字段,因此在分配字段之前,它不会存在于对象上。如果您只使用nullundefined 初始化该字段,该字段将出现在对象上。这是实现您想要的最简单的方法。

另一种方法是在每个字段上使用装饰器。这会更明确,但不会更短,也不一定容易出错

【讨论】:

  • 问题是我有很多类我想知道它们的属性,如果不指定默认值我就无法做到这一点。对吧?
  • @e.m.b 在任一解决方案中,分配默认值或装饰器,您都必须对所有属性执行某些操作
【解决方案2】:

确保您的编译器首先支持类。然后你必须做接口或类。前任。如果是一堂课,你需要做

class A {
    title = ''
}
var a = new A();
console.log(a);

将标题声明为字符串title: String = ''。你的写作更多是为了界面。这是输出,

Object {
    title: ""
}

是的,我现在更好地理解了您的问题,没有分配,它不会设置属性。

interface B {
    title: String;
}
class A implements B {
    title = '';
}
var a = new A();
console.log(a);

如果是这种情况,一个简单的解决方案是为该属性提供一些 默认 值。或者浏览一个列表,根据它们的类型手动初始化它们。

class A {
    keys = {
        title: 'String'
    }
}

【讨论】:

  • 有没有办法不设置默认值?
  • 谢谢 e.m.b,有趣,这太有趣了。
  • 问题是我有很多类,我像每个开发人员一样懒得为每个类属性分配一个默认值。
  • 试试a.constructor,例如。上面例子中的console.log(a.constructor)
  • a.constructor 返回一个名为 A() 的函数,它接受 0 个参数,而我只有一个等于 A 的属性名称。
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2017-11-28
  • 2023-03-10
  • 2021-01-18
相关资源
最近更新 更多