Saltar al contenido
webtype.orgwebtype.orgtsconfig

    ↑↓ mover · ⏎ abrir · esc cerrar

    tsconfig

    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": false
    type Handler = (value: string | number) => void
    
    declare const narrow: (value: string) => void
    
    export const handler: Handler = narrow

    Compila limpio

    Con ella encendida

    "strictFunctionTypes": true
    type 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