Generi c аргумент с числовым свойством - PullRequest
0 голосов
/ 29 января 2020

Я хочу создать такую ​​функцию:

insert<T>(target: T, property: keyof T, value: number) {
    target[property] = value;
}

Этот код не работает. Потому что target[property], если типа T[keyof T] и машинописный текст не позволят число в этом типе.

Я пробовал что-то вроде этого:

insert<T extends {[p in P]: number}, P keyof T>(target: T, property: P, value: number)

Но это не работает.

Как я могу заставить эту функцию работать?

1 Ответ

3 голосов
/ 29 января 2020

Исправлено использование типа значения непосредственно из сопоставленного типа:

function insert<T, K extends keyof T>
(target: T, property: K, value: T[K]) {
    target[property] = value;
}

Основное изменение:

  • second generi c K
  • третий тип аргумента: T[K]

Поскольку у вашего типа есть один тип значения, у нас даже может быть другое решение без второго обобщенного c:

function insert<T extends Record<string, number>>
(target: T, property: keyof T, value: T[keyof T]) {
    target[property] = value;
}

В этом контекст, когда все ключи представляют одно и то же значение, T[keyof T] также является правильным.

...