在TypeScript中,如何自动为类分配对象属性?

时间:2018-07-21 04:14:34

标签: typescript

假设我有一个如下课程:

class Company {

    name: string;
    url: string;
    address: string

    constructor() {
    }

}

然后我从数据库中检索一个对象,该对象包含类的某些或全部属性,例如

{name: "Acme", url: "www.acme.com"}

有没有一种方法可以自动从对象构造类?

此刻,我知道我可以做类似的事情:

    const company = new Company();
    const object = {name: "Acme", url: "www.acme.com"}; // in reality retrieve from database
    for (const key in object) {
        if (key == "name") {
            company.name = object[key];
        }
        if (key == "url") {
            company.url = object[key];
        }

    }

但这不是很优雅,并且在大量对象属性上变得笨拙。

有自动的方法吗?

1 个答案:

答案 0 :(得分:1)

根据您的方法进行调整:

const company = new Company();
const someObject = { name: "Acme", url: "www.acme.com" };

let legitKeys: Array<keyof Company> = [
    'name','address','url'
];

for (const key in someObject) {
    if (legitKeys.indexOf(key as keyof Company) !== -1) {
        company[key] = someObject[key];   
    }
}

“公司的密钥”类型用作安全网,因此您不能偶然将不是公司密钥的字符串添加到legitKeys数组中。

我觉得还有更好的方法,例如一种写if语句的更优雅的方式。

要使用noImplicitAny摆脱编译器错误,您可以使用此方法(仍然感觉可以做得更好):

class Company implements IndexSignature { 
    [key: string]: any;
    ...
 }

interface IndexSignature {
    [key: string]: any;
}

const someObject = {
    name: "Acme", url: "www.acme.com"
} as IndexSignature;