Constraints en los miembros de la interfaz en genéricos mecanografiados

Tengo un método que debería aceptar cualquier objeto, siempre que todos sus campos sean cadenas o números

He hecho esto, lo que funciona muy bien con pato escribiendo

static interpolateParams(
    route: string, 
    params: {[key: string] : string | number}) : string {

    const parts = route
        .split("/")
        .map(part => {
            const match = part.match(/:([a-zA-Z09]*)\??/);
            if (match) {
                if (!params[match[1]]) {
                    console.error("route argument was not provided", route, match[1]);
                    return part;
                }

                return params[match[1]];
            }
            else {
                return part;
            }
        })

    return "/" + parts.slice(1).join("/");
}

y llam

interpolateParams("/api/:method/:value", {method: "abc", value: 10});

Ahora quiero hacerinterpolateParams para aceptar cualquier interfaz para la rutaparams.

interpolateParams<IABCParams>("/api/:method/:value", {method: "abc", value: 10});

Problema es que aún debe coincidir con las restricciones para todos los campos que son cadenas o números

¿Hay alguna manera de especificar la restricción genérica en todos los campos de la interfaz dada para que sea de cierto tipo?

Intenté que

static interpolateParams<T extends {[key: string] : string | number}>(
    route: string, 
    params: T) : string {

y obviamente obtuve este

Type 'IABCParams' no cumple la restricción '{[clave: cadena]: cadena | número; } '.

alta la firma @Index en el tipo 'IABCParams'.

Gracia

Respuestas a la pregunta(3)

Su respuesta a la pregunta