typescript - Limitar el tipo de parámetro de función solo a las claves de una interfaz con un tipo específico
Supongamos que tengo una interfaz llamada dto. Tiene varios campos en ella con diferentes tipos.
Quiero tener una función que solo pueda aceptar un parámetro cuyo nombre sea una de las claves de dto y cuyo tipo sea únicamente número.
interface dto {
aaa: string,
bbb: number,
ccc: boolean,
ddd: number,
}
const variable = <dto> {
aaa: "hello",
bbb: 42,
ccc: false,
ddd: 914
};
function test(param: <SOME MAGIC HERE>): number {
return variable[param] + 10;
}
console.log(test("aaa")); // error, because dto.aaa has type of string
console.log(test("ccc")); // error, because dto.ccc has type of boolean
console.log(test("eee")); // error, because "eee" id not among keys of dto
console.log(test("bbb")); // ok, will return 52, because dto.bbb has type of number and "bbb" is among keys of dto
¿Es siquiera posible?
Respuesta #1
Sí
type OnlyNumbers<T> = {
[Prop in keyof T]: T[Prop] extends number ? Prop : never
}[keyof T]
function test(param: OnlyNumbers<dto>): number {
return variable[param] + 10;
}
