2017-07-16 144 views
11

我刚刚升级打字稿,现在是给我的knockout.validation.d.ts行错误:typescript编译器错误? knockout.validation.d.ts不从V2.3到V2.4编译了

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试图表明KnockoutSubscribableFunctions现在有额外的成员。这里是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

您在原始界面上单独出现错误?还是有更多的代码?我不明白为什么你会得到一个错误,除非你试图将某些东西分配给'KnockoutSubscribableFunctions'类型的东西。 –

+0

编译器在knockout.d.ts中标记错误,即使它抱怨在knockout.validation.d.ts中定义的成员。这似乎与我的代码无关。我将看到有关创建仅包含这两个.d.ts文件的全新项目。但我的印象是,只有将这两个文件放在一起才会给我带来错误。 –

+0

哦,如果不明确,在2.3版本的编译器中编译得很好。我刚升级到2.4。1,并且在编译相同的项目时没有对该项目进行任何更改而出现此错误。 –

回答

14

问题:

[key: string]: KnockoutBindingHandler; 

与其他PARAMS:

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; 

这可能会为您提供一些额外的自动完成功能的帮助。

+0

你是对的。我正在看这个页面:https://www.typescriptlang.org/docs/handbook/interfaces.html在超额属性检查部分下,作为编译器允许其他属性以及特定属性的示例,但在示例中,他们也使用:任何。真的很可惜。 knockout.d.ts目前定义的方式看起来应该可以工作并且工作良好。有一些特定的成员,然后可能有KnockoutBindingHandler类型的其他成员。 –

+1

自从从TS 2.1升级到TS 2.5后,我遇到了与knockout.d.ts相同的问题。像Mark说的那样,TypeScript 2.4引入了额外的类型检查,用当前的knockout.d.ts(在我的例子中是knockout.TypeScript.DefinitelyTyped v1.1.6)公开了一些潜在的“类型问题”。解决这个问题的办法似乎是将skipLibCheck设置为true,例如在tsconfig.json –

+3

Ps中。如果在Visual Studio中构建,可以通过两种方式配置skipLibCheck:您可以添加tsconfig.json并在compilerOptions中指定“skipLibCheck”:true或在.csproj文件中添加msbuild参数: True