将类的所有属性添加到对象,而无需在Typescript中重新启动

时间:2018-03-11 19:51:09

标签: typescript casting properties

我有以下代码:

class Item {
    firstname : string;
    lastname : string;

    getFullName() : string {
        return this.firstname + " " + this.lastname;
    }
}

let obj : object = {firstname : "Foo", lastname: "Bar"};

let item : Item = obj as Item;

console.log(item.getFullName());

上面的示例抛出异常,因为obj不知道函数getFullName(),因为我只是告诉编译器,obj对象应该是{{ 1}},但事实并非如此。

是否可以将Item对象转换为obj对象,因此Item已正确分配给getFullName()而无需重新启动obj?< / p>

我通过JSON接收嵌套对象,我不想遍历所有这些对象,只是为了创建相应的类对象。

我希望将接收到的对象的属性动态映射到类对象上,就像 cast 一样,但是添加所有缺少的属性和函数。

1 个答案:

答案 0 :(得分:0)

Type assertions赢得了此功能。类型转换显式告诉编译器对象的类型,但它实际上不会更改该对象。但是,这就是构造函数的功能。

您可以将构造函数用作工厂函数并传递配置对象。然后,使用构造函数的主体来设置默认值,以防提供某些属性。将为您处理方法创建。

Random

现在,您可以从对象创建项目的新实例,如下所示:

class Item {
    firstname : string;
    lastname : string;

    getFullName() : string {
        return this.firstname + " " + this.lastname;
    }

    constructor(obj: Partial<Item>) {
      this.firstname = obj.firstname || '';
      this.lastname = obj.lastname || '';
    }
}

我在这里使用了let obj : object = {firstname : "Foo", lastname: "Bar"}; let item = new Item(obj); 类型,允许您对新项目使用任何配置。您可以创建项目而无需在配置对象中提供所有必需的属性,它将自动为您分配它们。 E.g。

Partial

您现在不需要立即投放,因为let item2 = new Item({firstname: 'Foo'}); item实际上属于item2类型。

在此处详细了解部分类型:https://www.typescriptlang.org/docs/handbook/advanced-types.html