2017-04-04 62 views
0

說我有一個打字稿類:如何獲取公共字段/屬性名稱的數組?

class Person 
{ 
    constructor(public readonly firstName: string, public readonly lastName: string, public readonly id: number) 
    { 

    } 
} 

我想列出使用一些通用的功能給定類的所有公共屬性。

所以假設getAllPublicProps < ...>將用於這樣的:

const allPublicProps: (keyof Person)[] = getAllPublicProps<Person>() ; 

,並返回一個字符串等價於[ '的firstName', 'lastName的', '身份證']數組。

回答

0

這是有點可能的,如果你能接受一個有點醜陋,比如實例化類和接受,它不會理解私人和公共性之間的區別(除非你對其進行編碼,以某種方式)。

假設你有你的類

class Person { 
    constructor(public readonly firstName: string, 
       public readonly lastName: string, 
       public readonly id: number, 
       private readonly _secret: number) {} 
} 

你可以寫一個實用程序方法

class Util { 
    static getProperties(obj: any): string[] { 
    const result = []; 
    for (let property in obj) { 
     if (obj.hasOwnProperty(property) && !property.startsWith('_')) { 
     result.push(property); 
     } 
    } 
    return result; 
    } 
} 

而且使用它

const allProperties = Util.getProperties(new Person()); 
+0

感謝您的回答,但我希望它可以在不實例化對象來完成。 – user3284063

0

不知道你的確切使用情況下,很難給你一個具體的答案。 但我要試試:)

由於打字稿的類型標註在編譯時只提供,而不是運行時,有沒有真正在編譯時性能之間的差異了。例如:

class Person { 
    private secret = '123'; 
    constructor(
     public readonly firstName: string, 
     public readonly lastName: string, 
     public readonly id: number 
    ) { } 
} 

將被編譯到

var Person = (function() { 
    function Person(firstName, lastName, id) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.id = id; 
     this.secret = '123'; 
    } 
    return Person; 
}()); 

此外,雖然type PersonProperties = keyof Person會給你一個字符串類型的所有公共屬性,不能使用此類型來過濾任何東西,因爲它是隻有一個註釋。因此,您只能使用PersonProperties作爲功能簽名。

想你可以使用Reflect,但這將包括硬編碼的公共屬性。此外,Angular的編譯器濫用TS編譯器來編寫在編譯期間可用的元數據。如果有任何框架不可知論的lib,我現在不會這樣做。

+1

謝謝你,我喜歡你的解釋關於「期間沒有元數據運行';然而@ Hampus的回答是有點更準確:) – user3284063