Как правильно заполнить массив внутри объекта? - PullRequest
0 голосов
/ 16 мая 2019

Я хочу сделать deckeditor, где вы можете выбирать из художественных работ, которые вы берете из какого набора.По этой причине я хотел бы добавить все возможности этой Карты к своему объекту для более легкой обработки позже.

class Card_possibilities {
    public id: number;
    public cardname: string;
    public edition: string;
    constructor(id: number, cardname: string, edition: string) {
        this.id = id;
        this.cardname = cardname;
        this.edition = edition;
    }
}
class Deck_List{
    id: number;
    cardname: string;
    quantity: number;
    _possibilities: Card_possibilities[];
    constructor(id: number, quantity: number, cardname: string, _possibilities: Card_possibilities[]=[]) {
        this.id = id;
        this.quantity = quantity;
        this.cardname = cardname;
    }
    public set possibilities(CardArray: Card_possibilities[]){
        this._possibilities = CardArray;
     }
}
let cardnames_obj: Deck_List=new Deck_List(43,2,"Cancel");

let singleCard1:Card_possibilities= {id: 43, cardname: "Cancel", edition: "10E"};
let singleCard2:Card_possibilities= {id: 1227, cardname: "Cancel", edition: "AKH"};
let CardArray:Card_possibilities[]=[];
CardArray.push(singleCard1);
CardArray.push(singleCard2);

cardnames_obj.possibilities(CardArray); //<-- error

Посмотрите на StackBlitz https://stackblitz.com/edit/typescript-zwqpxp Но когда я пытаюсь заполнить возможности, яполучить ошибку:

Невозможно вызвать выражение, тип которого не имеет подписи вызова.Тип «Card_possabilities []» не имеет совместимых сигнатур вызовов.

Какие-либо предложения, что я делаю неправильно?

Решение: используйте правильный метод Setter: cardnames_obj.possabilities =CardArray;

1 Ответ

1 голос
/ 16 мая 2019

Этот метод класса:

    public set possibilities(CardArray: Card_possibilities[]){
        this._possibilities = CardArray;
     }

является установщиком, одной из особенностей классов машинописи .

Объявляя этот метод с помощью setключевое слово, это означает, что всякий раз, когда вы пишете свойство possibilities для Deck_List, функция запускается (вместо попытки изменить поле possibility, которого даже не существует), поэтому:

cardnames_obj.possibilities = CardArray;

Запустит функцию set.Вместо этого вы пытаетесь вызвать его напрямую, что неправильно:

cardnames_obj.possibilities(CardArray); // это не удается

Таким образом, ваша проблема не имеет ничего общего с массивами, а с тем, как выиспользуя установщик possibilities.

Теперь, в зависимости от вашей конфигурации tsc, у вас могут быть другие ошибки, связанные с типизацией, такие как отсутствие типа возврата в сигнатурах функций и тому подобное, я не уверен в этом (ноЯ думаю, что сеттеры не нуждаются в подписи типа).

...