@vadimek
Полуджун

Как передать дженерик функции аргумент key типа keyof T и чтобы при этом же было T[key]: number?

Есть функция:

function mkSorter<T extends { [key: string]: unknown }>(prop: keyof T) {
  return (a: T, b: T) => a[prop] - b[prop];
}


Как добавить еще одно ограничение, чтобы можно было передать только такой prop, где prop: keyof T и еще T[K]: number

Чтобы использовать вот так:

type SomeObjectType = {
  number: number;
  alsoNumber: number;
  string: string;
  anotherString: string;
  bool: boolean;
};

const columns: ColumnsType<SomeObjectType> = [
  {
    title: 'Also number',
    dataIndex: 'alsoNumber',
    sorter: mkSorter<SomeObjectType>('alsoNumber'),
    defaultSortOrder: 'descend',
  },
];


И никакие значения, кроме 'number' и 'alsoNumber', нельзя было передать в этом случае.

Текущий нерабочий вариант.
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
type ChooseKeys<O, T> = {
    [K in keyof O]: O[K] extends T ? K : never;
}[keyof O];

// 'number' | 'alsoNumber'
type Test1 = ChooseKeys<{
  number: number;
  alsoNumber: number;
  string: string;
  anotherString: string;
  bool: boolean;
}, number>;

// 'number' | 'alsoNumber' | 'bool'
type Test2 = ChooseKeys<{
  number: number;
  alsoNumber: number;
  string: string;
  anotherString: string;
  bool: boolean;
}, number | boolean>;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы