Przejdź do treści
webtype.orgwebtype.orgtsconfig

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    tsconfig

    strictFunctionTypes

    Parametry porównują się na odwrót

    Funkcja przyjmująca mniej nie może zastąpić tej, która musi przyjąć więcej — oczywiste, gdy się to powie, i niesprawdzane bez tej flagi.

    Od
    TypeScript 2.6
    strict
    W strict
    W twoim tsconfigu
    "strictFunctionTypes": true
    Skompilowane z
    "strict": true

    Ten sam fragment za każdym razem. Zmieniła się tylko opcja.

    Z wyłączoną

    "strictFunctionTypes": false
    type Handler = (value: string | number) => void
    
    declare const narrow: (value: string) => void
    
    export const handler: Handler = narrow

    Kompiluje się czysto

    Z włączoną

    "strictFunctionTypes": true
    type Handler = (value: string | number) => void
    
    declare const narrow: (value: string) => void
    
    export const handler: Handler = narrow

    Zgłasza TS2322

    Dlaczego kompilator się tym przejmuje

    Typy zwracane porównują się kowariantnie, czego wszyscy się spodziewają. Parametry porównują się kontrawariantnie, czego nie spodziewa się nikt, dopóki mu się tego nie wskaże: zamiennik musi obsłużyć każde wejście, które obiecywał oryginał. TypeScript przez lata sprawdzał parametry biwariantnie, bo prawdziwy kod — zwłaszcza DOM — na tym polega. Ta flaga włącza poprawną regułę dla typów funkcyjnych, celowo zostawiając parametry metod biwariantne — dlatego `interface A { f(x: string): void }` wciąż przechodzi tam, gdzie forma strzałkowa już nie.

    Wniosek

    Pisz callbacki jako właściwości o typie strzałkowym, nie jako metody, jeśli chcesz, by były sprawdzane.

    Gdzie iść dalej

    Opcji: 22