Búsqueda de sitios web

plantillas - Typescript: Cómo expresar una función genérica donde el tipo está restringido a uno de varios tipos


Por ejemplo, si un método que suma dos argumentos, a y b, donde deberían ser del mismo tipo y ese tipo debería ser una cadena o un número.

Intento 1:

function add(a: string | number, b: string | number) { 
    return a + b; 
}

Esto no funcionará porque los tipos de a y b pueden no coincidir; por lo que el error resultante tiene sentido: error TS2365: El operador '+' no se puede aplicar a los tipos 'string | number' y 'string | number'.

Intento 2:

function add<T extends string | number>(a: T, b: T) {
    return a + b;
}

Esto devuelve el mismo código de error: error TS2365: El operador '+' no se puede aplicar a los tipos 'T' y 'T'.

Intento 3:

function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any) {
    return a + b;
}

Esto (sobrecarga de funciones) funciona correctamente, pero parece excesivo. ¿Hay una forma más elegante de expresar esto?

Respuesta #1

También puedes combinar tus intentos 2 y 3 así:

function add<T extends string | number>(a: T, b: T): T;
function add(a: any, b: any) {
    return a + b;
}

Entonces puedes usarlo así:

// Return type is `number`
add(1, 2);
// Return type is `string`
add('1', '2');
add<number>(1, 2);
add<string>('1', '2');

... y estos provocan errores de tipo como se esperaba:

add(1, '2');
add<number>('1', '2');
add<string>(1, 2);
add(true, false);

Sin embargo, si no vas a usar el tipo de entrada, entonces me quedaría solo con las sobrecargas de funciones. Lo más fácil de entender en mi opinión.

Artículos relacionados