打字稿编译器bug? knockout.validation.d.ts不再编译

时间:2017-07-16 23:03:14

标签: typescript

我刚刚将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;
}

1 个答案:

答案 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;

这可能会为您提供一些额外的自动填充帮助。