Инициализация объектов с функциями в TypeScript - PullRequest
0 голосов
/ 27 апреля 2019

Допустим, у меня есть класс 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 Ответ

1 голос
/ 27 апреля 2019

Это потому, что когда вы используете литерал Object, вы должны создать все свойства и методы A, прежде чем машинопись сможет принять, что ваш объект имеет тип 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()
    }
}

UPDATE

Вы можете использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...