Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Typescript 检查对象(或只是类)是否具有属性_Typescript - Fatal编程技术网

Typescript 检查对象(或只是类)是否具有属性

Typescript 检查对象(或只是类)是否具有属性,typescript,Typescript,假设我有一门课: module MyModule { export class MyClass { x:number; y:number; } } 然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x” 如果我创建MyClass的实例,然后执行以下操作: myClassInstance.hasOwnProperty("x"); 除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我能在不创建MyClass实例的情

假设我有一门课:

module MyModule {
    export class MyClass {
       x:number;
       y:number;
    }
}
然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x”

如果我创建MyClass的实例,然后执行以下操作:

myClassInstance.hasOwnProperty("x");

除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我能在不创建MyClass实例的情况下做到这一点,那就最好了。

TypeScript在执行之前被编译成JavaScript。在最后的JavaScript代码中,TypeScript中的类型信息不再可用。因此,不可能在运行时检查TypeScript类型信息


如果要在编译时执行检查,可以使用以下示例中的接口:

interface IHasX
{
    x:any;
}

class MyClassA {
    x:number;
    y:number;
}

class MyClassB {
    y:number;
}

function Test(param: IHasX)
{
    // Do something with param.x 
}

var objA = new MyClassA();
var objB = new MyClassB();

Test(objA);
Test(objB);

最后一行<代码>测试(objB)将无法编译,因为TypeScript编译器知道
objB
属于
MyClassB
类型,并且该类没有接口
IHasX

所要求的名为
x
的属性。现在您可以执行此操作。我发布了一个增强版的TypeScript编译器,它允许您列出类或接口的所有成员。例如,您可以执行以下操作:

export class Person {
    name: string;
    surname: string;
    age: number;
    country: string;
}

function printMembers(clazz: Class) {
    let fields = clazz.members.filter(m => m.type.kind !== 'function'); //exclude methods.
    for(let field of fields) {
        let typeName = field.type.kind;
        if(typeName === 'class' || typeName === 'interface') {
            typeName = (<Class | Interface>field.type).name;
        }
        console.log(`Field ${field.name} of ${clazz.name} has type: ${typeName}`);
    }
}

//then, somewhere in your code:
let p = new Person();
printMembers(p.constructor.getClass());

您可以找到所需的所有详细信息

我希望在TypeScript级别执行此操作,而不是JavaScript。TypeScript在运行时不存在。TypeScript在执行之前会被翻译成JavaScript。如果您解释一下,为什么要在运行时检查某些属性,也许还有其他方法可以实现您的尝试。我有一个基本样式类,其中包含所有可用SVG属性的列表。然后我有一些类,它们扩展了Style类并包含一些附加信息,比如lineLength——这些不是SVG属性,但我希望保持它们的样式,因为我希望将负责元素可视部分的所有值保持在一个位置。所以,当我创建SVG元素时,我需要在其上设置基本样式类的所有属性,但不能设置像lineLength这样的属性。所以我想我可以创建一个Style实例并检查属性是否在这个类中。我想我可以使用getter和setter,然后这样做:Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Style),“x”)
$ node main.js
Field name of Person has type: string
Field surname of Person has type: string
Field age of Person has type: number
Field country of Person has type: string