Typescript ошибка компилятора? knockout.validation.d.ts больше не компилируется

Я только что обновил Typescript с v2.3 до v2.4, и теперь он выдает ошибку в строках knockout.validation.d.ts:

interface KnockoutSubscribableFunctions<T> {
    isValid: KnockoutComputed<boolean>;
    isValidating: KnockoutObservable<boolean>;
    rules: KnockoutObservableArray<KnockoutValidationRule>;
    isModified: KnockoutObservable<boolean>;
    error: KnockoutComputed<string>;
    setError(error: string): void;
    clearError(): void;
}

Здесь knockout.validation пытается указать, что KnockoutSubscribeableFunctions теперь имеет дополнительных членов. Вот определение этого интерфейса в knockout.d.ts:

interface KnockoutSubscribableFunctions<T> {
    [key: string]: KnockoutBindingHandler;

    notifySubscribers(valueToWrite?: T, event?: string): void;
}

теперь компилятор жалуется:

Свойство "isValid" типа "KnockoutComputed" нельзя назначить строковому индексу типа "KnockoutBindingHandler".

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

Я взял начальное определение интерфейса на игровую площадку, и он даже пожаловался, что notifySubscribeers не может быть назначен на KnockoutBindingHandler.

С новым компилятором, как вы получите этот код для компиляции?

Пока что я использую метод грубой силы, чтобы заставить это скомпилировать, в котором я изменяю определение knockout.d.ts следующим образом:

interface KnockoutSubscribableFunctions<T> {
    [key: string]: any;//KnockoutBindingHandler;

    notifySubscribers(valueToWrite?: T, event?: string): void;
}

Ответ 1

Проблема существует из-за различий в типах:

[key: string]: KnockoutBindingHandler;

И другие параметры:

isValid: KnockoutComputed<boolean>;
isValidating: KnockoutObservable<boolean>;
rules: KnockoutObservableArray<KnockoutValidationRule>;
isModified: KnockoutObservable<boolean>;
error: KnockoutComputed<string>;
setError(error: string): void;
clearError(): void;

Ошибка, которую вы получили, в основном говорит: тип KnockoutComputed не может быть присвоен типу KnockoutBindingHandler.

Вероятно, эта проверка времени компиляции улучшена в TS 2.4, поэтому у вас не было этой проблемы ранее.

Ваше решение работает:

[key: string]: any;//KnockoutBindingHandler;

И если вы можете изменить этот код, вы можете попробовать другое "красивое" решение:

[key: string]: any | KnockoutBindingHandler;

Что может предоставить вам дополнительную помощь автозаполнения.