使用TypeScript中的函数初始化对象

时间:2019-04-27 11:30:29

标签: typescript nativescript

让我们说我有一个像这样的课程A

export class A extends Observable {

    constructor(
        public id: string
    ) { super(); }

    public testCallFunction() {
        return "Function called on object with id " + this.id;
    }
}

我可以像这样初始化A的数组,并且该函数被公开:

this.data = [new A("1"), new A("2")];

当我像这样初始化数组时,由于“类型错误”,它不允许我调用该函数:

this.data = [{ "id": "1" }, { "id": "2" }] as Array<A>;
// ERROR TypeError: a.testCallFunction is not a function

反正我可以使用第二种方法初始化数组并公开函数吗?

在哪里可以了解有关此行为的更多信息?

游乐场:https://play.nativescript.org/?template=play-ng&id=G7b4f4&v=3

1 个答案:

答案 0 :(得分:1)

这是因为在使用Object文字时,必须先创建A的所有属性和方法,然后Typescript才能接受您的对象属于A类型。

这就是为什么您使用new创建实例的原因。现在,您将自动获得所有属性和方法。

class A {

    private id: string

    constructor(id: string) { 
        this.id = id
    }

    public testCallFunction() {
        return "Function called on A instance"
    }
}

class Test {
    private data: A[];

    constructor() {

        this.data = [new A("1"), new A("2")]

        // typescript does not recognise this object 
        // as an A instance because it has no testcallFunction

        // this.data = [{ "id": "1" }, { "id": "2" }]

        var a:A = this.data[0]
        a.testCallFunction()
    }
}

更新

您可以使用Object.assign()将JSON中的属性添加到现有实例。

class A {

    public id: string

    public testCallFunction() {
        console.log("my id is " + this.id)
    }
}

let a = new A()
let json = { "id": "1" }

Object.assign(a, json)

console.log("id is now " + a.id)
a.testCallFunction()