Как использовать Mobx createObservableArray с TypeScript? - PullRequest
0 голосов
/ 16 июня 2019

Попытка # 1:

import { observable } from "mobx";
import { createObservableArray, IObservableArray } from "mobx/lib/internal";
export class Example1 {
    @observable items : IObservableArray<string>;

    constructor() {
        this.items = [];
    }
}

Результат:

В типе 'never []' отсутствуют следующие свойства из типа 'IObservableArray': spliceWithArray, наблюдать, перехватывать,очистить и еще 4.ts (2740)

Попытка № 2:

import { observable } from "mobx";
import { createObservableArray, IObservableArray } from "mobx/lib/internal";
export class Example1 {
    @observable items : IObservableArray<string>;

    constructor() {
        this.visible = createObservableArray<string>([]);
    }
}

Результат:

Ожидается 2-4 аргумента, ноgot 1.ts (2554) observablearray.d.ts (41, 84): аргумент для «энхансера» не был предоставлен.

Зачем мне это нужно?Поскольку я хочу использовать метод replace () наблюдаемого массива:

 this.items.replace(newItems);

Для этого items должен иметь тип IOvservableArray.В противном случае я получу эту ошибку:

Свойство replace не существует для типа string [].

Конечно, я всегда могу сделать это:

(this.items as IObservableArray<string>).replace(items);

Но это очень уродливо, учитывая, что я могу захотеть заменить все элементы в нескольких местах в моем коде.Это также не безопасно типа.Если мы не заботимся о безопасности типов, то это короче и не хуже:

(this.items as any).replace(items);

Но это не самый красивый код.IObservableArray был экспортирован, поэтому я думаю, что должен быть правильный способ его использования и обеспечения безопасности типов.Но как?

1 Ответ

1 голос
/ 16 июня 2019

Я часто использую этот шаблон при объявлении наблюдаемых массивов:

readonly items = observable<string>([]);

Выполняет ли это то, что вам нужно?

...