strictFunctionTypes
Los parámetros se comparan al revés
Una función que acepta menos no puede sustituir a una que debe aceptar más: obvio al decirlo, y sin comprobar sin esta bandera.
- Desde
- TypeScript 2.6
- strict
- En strict
- En tu tsconfig
"strictFunctionTypes": true- Compilado con
"strict": true
El mismo fragmento las dos veces. Solo cambió la opción.
Con ella apagada
"strictFunctionTypes": falsetype Handler = (value: string | number) => void declare const narrow: (value: string) => void export const handler: Handler = narrow
Compila limpio
Con ella encendida
"strictFunctionTypes": truetype Handler = (value: string | number) => void declare const narrow: (value: string) => void export const handler: Handler = narrow
Emite TS2322
Por qué al compilador le importa
Los tipos de retorno se comparan covariantemente, como todos esperan. Los parámetros se comparan contravariantemente, cosa que nadie espera hasta que se la señalan: el sustituto tiene que manejar todas las entradas que prometía el original. TypeScript comprobó los parámetros de forma bivariante durante años porque el código real —sobre todo el DOM— depende de ello, y esta bandera activa la regla correcta para los tipos de función dejando a propósito los parámetros de método bivariantes: por eso `interface A { f(x: string): void }` sigue pasando donde la forma flecha no.
Conclusión
Escribe los callbacks como propiedades con tipo flecha, no como métodos, si quieres que se comprueben.
Adónde ir después
22 opciones

