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;
Что может предоставить вам дополнительную помощь автозаполнения.