Búsqueda de sitios web

¿Cómo decirle a TypeScript que se lanzará un error si un argumento es nulo?


Suponga lo siguiente:

const handleParse = (arg: { value: boolean } | null) => {
    if (!arg?.value) {
        throw new Error(`\`arg\` is null`)
    }
    
    return arg.value;
}

Aquí, TypeScript sabe de manera inmediata que el arg.value devuelto siempre estará definido.

Sin embargo, estoy intentando refactorizar el error lanzado a un método auxiliar, pero está lanzando un error:

const checkDependency = (dependency: any) => {
    if (!dependency) {
        throw new Error(`\`dependency\` is null`)
    }
}

const handleParse = (arg: { value: boolean } | null) => {
    checkDependency(arg)
    
    return arg.value;
//         ^^^ 'arg' is possible null
}

¿Cómo puedo lograr esto? He intentado jugar con el tipo de retorno, pero en vano:

const checkDependency = (dependency: any):  Error | void  => {
    if (!dependency) {
        throw new Error(`\`arg\` is null`)
    }

    return;
}

Respuesta #1

Puedes usar una función de aserción de tipo para eso combinada con un parámetro de tipo que combinamos con null:

function checkDependency<T>(arg: T | null): asserts arg is T {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^
    if (arg === null) {
        throw new Error(`\`arg\` is null`);
    }
}

Aquí tienes tu ejemplo usando eso:

const handleParse = (arg: { value: boolean } | null) => {
    checkDependency(arg);
    
    return arg.value; // <== No error
};

Ejemplo completo en el Playground

Las funciones de aserción de tipo se añadieron en TypeScript v3.7. Son similares a los predicados de tipo, pero hacen exactamente lo que describes: Indican que si la función no lanza un error, el tipo es tal como la función lo afirma.

Artículos relacionados