Typescript: mismo tipo genérico que el tipo resuelto del parámetro anterior

Me gustaría saber cómo especificar ese tipo genérico si es el mismo que el tipo resuelto del argumento anterior, cuando el tipo puede ser de varios tipos.

TypeScript playground

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

add('hello', ' world');
add(1, 1);

Quiero poder decirle al compilador que todosT son del mismo tipo, ya sea número o cadena. Podría perderme alguna sintaxis. Podría ser posible con tipos condicionales (hasta cierto punto) ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta