2017-07-16 143 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