让我们说我有一个像这样的课程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
答案 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()