Ограничьте тип параметра функции только ключами интерфейса с определенным типом

#typescript

Вопрос:

Давайте предположим, что у меня есть интерфейс, называемый dto . В нем есть несколько полей разных типов.

Я хочу иметь функцию, которая может принимать только параметр, имя которого является одним из ключей dto , а тип-только число.

 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
 

Возможно ли это вообще?

Ответ №1:

ДА

 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;
}
 

введите описание изображения здесь

Комментарии:

1. Извините, забыл дженерик