BuckvicK
@BuckvicK
Опытный ламер

Как типизировать аргумент функции внутри интерфейса который зависит от поля интерфейса?

Добрый день, есть такой код и вопрос как типизировать аргумент в функции showValue (что указать вместо any) что бы при использовании его в объекте A это адекватно отслеживалось typescript:
interface Row<P> {
	field: keyof P;
	showValue?: (value: any) => string;
}

interface Data {
	name?: string;
	age?: number;
}

const A: Row<Data>[] = [
	{
		field: "age",
// Здесь value должен иметь тип number
		showValue: (value) => value.toString(),
	},
	{
		field: "name",
// Здесь value должен иметь тип string
		showValue: (value) => value.toString(),
	},
];
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
WblCHA
@WblCHA
interface Row<T, K extends keyof T> {
  field: K;
  showValue?: (value: T[K]) => string;
}

interface Data {
  name?: string;
  age?: number;
}

type AData<T> = {
  [K in keyof T]: Row<T, K>;
}[keyof T]

const A: AData<Data>[] = [
  {
    field: "age",
// Здесь value должен иметь тип number
    showValue: (value) => value.toString(),
  },
  {
    field: "name",
// Здесь value должен иметь тип string
    showValue: (value) => value.toString(),
  },
];

https://www.typescriptlang.org/play?#code/JYOwLgpg...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы