¿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.
