Mam Extender Knockout, którego chcę używać w pliku typu maszynastu, a ja nie mogę sprawdzić, jak go zadeklarować.

Extender jest napisany w JavaScript, a chcę go użyć z pliku maszynopastu (jak projekt jest obecnie mieszanką JavaScript i maszynopis). Jednak nie byłem w stanie wypracować, jak dodać definicję dla przedłużacza. Z To pytanie Dodałem do interfejsu {x0}} (choć nie jestem pewien, czy Tęskniłem za punktem tego pytania) jak:

interface KnockoutExtenders {
    trackChange<T>(target: T, track: boolean): ITrackChange<T>;
}

interface ITrackChange<T> extends KnockoutObservable<T> {
    setOriginalValue(startingValue: T): void;
    resetToConfirmedValue(): void;
    setConfirmedValue(): void;
    numberChanges(): number;
}

Wykorzystanie dla przedłużacza jest następujące:

class ProductTypeViewModel {
    constructor() {
        this.name.setOriginalValue('Initial value');
    }

    name = ko.observable('').extend({
        trackChange: true
    });
}

Otrzymuję błąd budowy maszynopisów na this.name.setOriginalValue, ponieważ Property 'setOriginalValue' does not exist on type 'KnockoutObservable<string>', co jest oczywiście prawdziwe.

Jak powinienem zadeklarować przedłużenie, abyś miał rozpoznać, że obserwowalny otrzymał nowe metody (tj. Nie jest już KnockoutObservable<string> i jest teraz teraz ITrackChange<string>)?

(Nie jestem pewien, czy wyjaśnienie przedłużacza jest istotne, ale tu jest: I. Extender utworów zmienia się w obserwowalny i pozwala im zostać zaakceptowane / anulowane. Pozwala to na obserwowanie do wyświetlania wartości bieżącej i na Edytuj Modal To samo Obserwowalny może być używany do zmiany wartości, ale wartość bazowa nie zmienia się, dopóki użytkownik potwierdzi ich zmian w modalnym. Jeśli je anulują, nic się nie zmieniło.

0
Tim 15 luty 2017, 19:31

2 odpowiedzi

Najlepsza odpowiedź

Udało mi się obejść błędów maszynopisowych, ręcznie rzucając rodzaj obserwowalnego.

name = ko.observable('').extend({
    trackChange: true
}) as ITrackChange<string>;

Wolałbym, aby móc go gdzieś zarejestrować, aby nie musiał używać tej obsady na każdym obserwowalnym rozciągnięciu, ale robiąc to ręcznie wystarczy. Jeśli ktoś pojawia się lepszym rozwiązaniem, z radością zaakceptuję ich odpowiedź. (Jeśli jest to złe podejście, skomentuj, aby wyjaśnić dlaczego, zawsze jestem szczęśliwy, że mogę się nauczyć!)

Należy pamiętać, że jeśli obserwowalny ma wiele przedłużaczy, typ przecięcia może być użyty do pokazania wszystkich odpowiednich interfejsów, zgodnie z Ta odpowiedź na inne pytanie :

name = ko.observable(false).extend({
    trackChange: true,
    logChange: true
}) as ITrackChange<boolean> & ILogChange<boolean>;
0
Tim 24 styczeń 2018, 17:35

Spróbuj wykonać następujące czynności

interface KnockoutObservable<T> extends Observable<T> {
  setOriginalValue(param: string): void;
}

class ProductTypeViewModel {
    private name: KnockoutObservable<string>;

    constructor() {
        this.name.setOriginalValue('Initial value');
    }
}
0
Tumen_t 15 luty 2017, 16:43