es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprueba si la variable se puede llamar.

Quiero crear una función de ayuda isCallback que devuelva si una función es llamable.

Tengo un tipo que puede ser true o un callback con un argumento específico. En mi código actual, tengo muchas comprobaciones como typeof foo === 'function' y quiero refactorizarlas con la función isCallback.

Creé esta función de ayuda isCallback:
export const isCallback = (maybeFunction: unknown): boolean =>
typeof maybeFunction === ‘function’

Mi problema es que cuando lo uso TypeScript está confundido:

if(isCallback(foo)) {
foo(myArgs) // Error aquí
}

y se queja con:
This expression is not callable.
Not all constituents of type ‘true | ((result: Result) => void)’ are callable.
Type ‘true’ has no call signatures.

¿Cómo puedo crear una función que devuelva true si la variable es llamable y TypeScript también lo sepa?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer que TypeScript reconozca el tipo de función llamable, es necesario definir un tipo separado para ello. Puedes hacer esto utilizando la notación de tipo de función:

    type CallbackFunction = (arg: specificArgType) => void;
    

    Reemplaza specificArgType con el tipo real del argumento que espera tu función de retorno de llamada.

    Luego, actualiza tu función isCallback para utilizar este nuevo tipo:

    export const isCallback = (maybeFunction: unknown): maybeFunction is CallbackFunction =>
      typeof maybeFunction === 'function';
    

    El isCallback es un predicado de tipo. Le dice a TypeScript que si isCallback devuelve true, la variable de entrada está garantizada que será del tipo CallbackFunction.

    Ahora, cuando utilizas isCallback en tu código, TypeScript inferirá correctamente que la variable foo es llamable:

    if (isCallback(foo)) {
      foo(myArgs); // No hay error aquí
    }
    

    Ten en cuenta que no puedes llamar a foo sin verificar si es una función de retorno de llamada primero, ya que el tipo de foo sigue siendo true | CallbackFunction.

Comments are closed.