我刚刚将v2.3的typescript升级到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试图表明KnockoutSubscribableFunction现在有额外的成员。以下是knockout.d.ts中此接口的定义:
interface KnockoutSubscribableFunctions<T> {
[key: string]: KnockoutBindingHandler;
notifySubscribers(valueToWrite?: T, event?: string): void;
}
编译器现在抱怨:
'KnockoutComputed'类型的属性'isValid'不能分配给字符串索引类型'KnockoutBindingHandler'。
我不明白为什么它没有将这些新值视为界面中的新属性?为什么要说他们必须映射到索引签名? docs似乎表明您可以在同一界面中拥有索引签名和其他属性。
我把接口的初始定义带到了游乐场,它甚至抱怨notifySubscribers不能分配给KnockoutBindingHandler。
使用新编译器如何编译此代码?
现在有一种强制方法可以让它进行编译。我正在将knockout.d.ts定义更改为:
interface KnockoutSubscribableFunctions<T> {
[key: string]: any;//KnockoutBindingHandler;
notifySubscribers(valueToWrite?: T, event?: string): void;
}
答案 0 :(得分:20)
问题的存在是因为:
的类型不同openjdk
和其他参数:
[key: string]: KnockoutBindingHandler;
你得到的错误基本上说:KnockoutComputed类型不能分配给KnockoutBindingHandler类型。
这可能会在TS 2.4中改进编译时检查,这就是为什么你以前没有遇到过这个问题的原因。
您的解决方案有效:
isValid: KnockoutComputed<boolean>;
isValidating: KnockoutObservable<boolean>;
rules: KnockoutObservableArray<KnockoutValidationRule>;
isModified: KnockoutObservable<boolean>;
error: KnockoutComputed<string>;
setError(error: string): void;
clearError(): void;
如果您可以更改此代码,您可以尝试另一种“更漂亮”的解决方案:
[key: string]: any;//KnockoutBindingHandler;
这可能会为您提供一些额外的自动填充帮助。