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": falsetype Handler = (value: string | number) => void declare const narrow: (value: string) => void export const handler: Handler = narrow
Kompiluje się czysto
Z włączoną
"strictFunctionTypes": truetype 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

