Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angular 5/TypeScript中获取类(接口)属性,而不指定默认值_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 在Angular 5/TypeScript中获取类(接口)属性,而不指定默认值

Javascript 在Angular 5/TypeScript中获取类(接口)属性,而不指定默认值,javascript,angular,typescript,Javascript,Angular,Typescript,让我们假设我有一个接口A,我按照Angular style指南将其声明为一个类。这个类有很多属性,我想在不给它们赋值的情况下获取它们的名称。我怎样才能做到这一点 A类: export class A { property1: string; property2: string; ... property30: string; } 我尝试从这个类实例化一个新对象,并调用object.keys和object.getOwnPropertyNames,但这两个方法返回一个空数组,因为它

让我们假设我有一个接口A,我按照Angular style指南将其声明为一个类。这个类有很多属性,我想在不给它们赋值的情况下获取它们的名称。我怎样才能做到这一点

A类:

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

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

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


另一种方法是在每个领域都使用装饰器。这将更加明确,但不更短,也不一定不容易出错。属性声明的工作方式是,它们只是向编译器提示该属性可能在运行时存在。在JavaScript中,您不需要声明字段,因此在分配字段之前,该字段不会存在于对象上。如果仅使用
null
undefined
初始化字段,该字段将显示在对象上。这是实现你想要的最简单的方法


另一种方法是在每个领域都使用装饰器。这将更加明确,但不会更短,也不一定不容易出错

请确保编译器首先支持类。然后,您必须执行接口或类。如果是一门课,你需要

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'
    }
}

首先确保编译器支持类。然后,您必须执行接口或类。如果是一门课,你需要

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'
    }
}

可能重复的Nop它不是重复的,因为在提供的链接中,他们为属性提供了一些默认值。可能重复的Nop它不是重复的,因为在提供的链接中,他们为属性提供了一些默认值。没有办法不设置默认值?谢谢e.m.b,很有趣,这真是太有趣了。问题是我有很多类,我和每个开发人员一样懒得为每个类属性分配默认值。请尝试
a.constructor
,例如
console.log(a.constructor)
从上面的示例a.constructor返回一个名为a()的函数这需要0个参数,我只有一个等于A的属性名。没有默认值是不行的?谢谢e.m.b,很有趣,这太有趣了。问题是我有很多类,我和每个开发人员一样懒得为每个类属性指定默认值。试试
A.constructor
,例如,
console.log(a.constructor)
从上面的示例a.constructor返回一个名为a()的函数,该函数接受0个参数,我只有一个等于a的属性名。问题是,我有很多类,我想知道它们的属性,如果不指定默认值,我就无法做到这一点。对吗?@e.m.b在任何一种解决方案中,分配默认值或装饰符,都必须对所有属性进行处理。问题是我有很多类,我想知道它们的属性,如果不分配默认值,我就无法做到这一点。对吗?@e.m.b在任何一种解决方案中,分配默认值或装饰符,您都必须对所有属性执行某些操作