Типизация функции обновления свойств объекта

подскажите как при помощи TypeScript типизировать функцию update, таким образом чтобы первым аргументом TypeScript подсказывал какие свойства есть, а вторым аргументом какой тип имеет выбранное свойство? Нашёл вариант с перегрузками, но он не очень подходит, так как потенциально свойств в объекте может быть любое количество, вот пример:

interface Data {
  name: string,
  age: number,
  gender: 'man' | 'woman',
  online: boolean,
  file: File | null
}

const data: Data = {
  name: 'Artem',
  age: 29,
  gender: 'man',
  online: true,
  file: null
}


function update(property: "name", value: string): void;
function update(property: "age", value: number): void;
function update(property: "gender", value: 'man' | 'woman'): void;
function update(property: "online", value: boolean): void;
function update(property: "file", value: File | null): void;
function update(property: keyof Data, value: Data[keyof Data]) {
  data[property] = value
}

К тому же в строке data[property] = value TypeScript сообщает об ошибке

Тип "string | number | boolean | File | null" не может быть назначен для типа "never".

Подскажите какие ещё есть решения данной задачи ?


Ответы (1 шт):

Автор решения: nörbörnën

Keyof Type Operator

Generics

function update<T extends keyof Data>(property: T, value: Data[T]) {
  data[property] = value;
}

и перегрузки функции update вам не понадобятся

→ Ссылка