2017-07-16 19 views
11

Właśnie zmodernizowane maszynopis z v2.3 do v2.4 i teraz daje mi błąd na liniach knockout.validation.d.ts:błąd kompilatora maszynopisu? knockout.validation.d.ts nie kompiluje już

interface KnockoutSubscribableFunctions<T> { 
    isValid: KnockoutComputed<boolean>; 
    isValidating: KnockoutObservable<boolean>; 
    rules: KnockoutObservableArray<KnockoutValidationRule>; 
    isModified: KnockoutObservable<boolean>; 
    error: KnockoutComputed<string>; 
    setError(error: string): void; 
    clearError(): void; 
} 

Tutaj nokaut.validation próbuje pokazać, że KnockoutSubscribableFunctions ma teraz dodatkowych członków. Oto definicja tego interfejsu w knockout.d.ts:

interface KnockoutSubscribableFunctions<T> { 
    [key: string]: KnockoutBindingHandler; 

    notifySubscribers(valueToWrite?: T, event?: string): void; 
} 

kompilator teraz narzeka, że:

Własność „isValid” typu „KnockoutComputed” nie jest przypisane do indeksu string „KnockoutBindingHandler” .

Nie rozumiem, dlaczego nie widzi te nowe wartości jako nowe właściwości w interfejsie? dlaczego próbuje powiedzieć, że muszą mapować na podpisy indeksu? docs wydaje się wskazywać, że możesz mieć podpis indeksu i inne właściwości w tym samym interfejsie.

Przyjąłem wstępną definicję interfejsu do placu zabaw, a nawet skarżyłem się, że funkcja notifySubscribers nie jest przypisywana do KnockoutBindingHandler.

Z nowym kompilatorem, w jaki sposób można skompilować ten kod?

na razie istnieje metoda brutalnej siły, aby to skompilować. Ja zmieniając definicję knockout.d.ts być:

interface KnockoutSubscribableFunctions<T> { 
    [key: string]: any;//KnockoutBindingHandler; 

    notifySubscribers(valueToWrite?: T, event?: string): void; 
} 
+0

Występuje błąd w samym oryginalnym interfejsie? Czy jest więcej kodu? Nie rozumiem, dlaczego dostałeś błąd, chyba że próbujesz przypisać coś do typu 'KnockoutSubscribableFunctions'. –

+0

Kompilator zgłasza błąd na linii w knockout.d.ts, mimo że narzeka na członków zdefiniowanych w nokaut.validation.d.ts. Wygląda na to, że nie ma to nic wspólnego z moim kodem. Zobaczę, jak utworzyć zupełnie nowy projekt, który obejmuje tylko te dwa pliki .d.ts. Ale mam wrażenie, że samo posiadanie tych dwóch plików razem z niczym innym da mi błąd. –

+0

Aha i gdyby nie było jasne, to skompilowane dobrze w wersji 2.3 kompilatora. Właśnie zaktualizowałem do wersji 2.4.1 i otrzymałem ten błąd podczas kompilowania tego samego projektu bez wprowadzania żadnych zmian w projekcie. –

Odpowiedz

14

Problem występuje ze względu na różnice w typach:

[key: string]: KnockoutBindingHandler; 

i innych params:

isValid: KnockoutComputed<boolean>; 
isValidating: KnockoutObservable<boolean>; 
rules: KnockoutObservableArray<KnockoutValidationRule>; 
isModified: KnockoutObservable<boolean>; 
error: KnockoutComputed<string>; 
setError(error: string): void; 
clearError(): void; 

The błąd w zasadzie mówi: typ KnockoutComputed nie może być przypisany do typu KnockoutBindingHandler.

Prawdopodobnie to sprawdzanie podczas kompilacji zostało poprawione w wersji TS 2.4, dlatego wcześniej nie występował ten problem.

Twoje rozwiązanie działa:

[key: string]: any;//KnockoutBindingHandler; 

i czy można zmienić ten kod można spróbować innego trochę „ładniejszej” rozwiązanie:

[key: string]: any | KnockoutBindingHandler; 

Który może zapewnić ci trochę dodatkowej pomocy autouzupełniania.

+0

Masz rację. Patrzyłem na tę stronę: https://www.typescriptlang.org/docs/handbook/interfaces.html pod sekcją Excess Property Checks jako przykład, w którym kompilator zezwala na inne właściwości, a także określone właściwości, ale w przykładzie , oni też użyli: każdy. To naprawdę szkoda. Sposób, w jaki knockout.d.ts jest obecnie zdefiniowany, wygląda na to, że powinien działać i działać dobrze. Istnieje kilka konkretnych członków, a następnie istnieje możliwość innych członków typu KnockoutBindingHandler. –

+1

Mam taki sam problem z Knockout.d.ts od aktualizacji z TS 2.1 do TS 2.5. Tak jak mówi Mark, TypeScript 2.4 wprowadza dodatkowe testy typów, które ujawniają niektóre potencjalne "problemy z typem" z obecnym knockout.d.ts (w moim przypadku knockout.TypeScript.DefinitelyTyped v1.1.6). Jednym z rozwiązań tego problemu wydaje się ustawienie wartości skipLibCheck na true, np. W tsconfig.json –

+3

Ps. Jeśli budujesz w Visual Studio, możesz pominąć skipLibCheck na dwa sposoby: możesz dodać tsconfig.json i określić "skipLibCheck": true w compilerOptions LUB dodać parametr msbuild do pliku .csproj: True

Powiązane problemy