Как я мог иметь правильный тип? - PullRequest
1 голос
/ 15 мая 2019

Извините за заголовок, действительно не знаю, какое имя подойдет для этого вопроса.

Я хочу создать функцию setItem для установки значения ключа в объекте:

const setItem = <T, U extends keyof T>(obj: T) => (key: U, value): void => {
    obj[key] = value
}

const person = {
    name: 'James',
    age: 13,
}

const setPerson = setItem(person)
setPerson('name', 125)

Нет ошибок времени компиляции, даже если мы установили свойство name в число. (потому что значение прямо сейчас - typeof any).

Так как я могу сказать TS, что obj [key] имеет значение typeof?

1 Ответ

3 голосов
/ 15 мая 2019

Включите режим компиляции --strict, чтобы value выдавало предупреждение "неявное any".Тип value должен быть T[U], тип поиска .

Обратите внимание, что если вы хотите, чтобы универсальная функция карри работала правильно, вам необходимо поместить параметры типа в нужное место:

const setItem = <T>(obj: T) => <U extends keyof T>(key: U, value: T[U]): void => {
    obj[key] = value;
}

Вы хотите, чтобы setItem(obj) возвращала универсальную функциюкоторый может принять любой U extends keyof T для key, поэтому параметр U должен быть в этой возвращаемой функции.Если вы поместите <T, U> в первую функцию, то компилятор попытается вывести U из значений, переданных в setIem(), и не сможет.Это в конечном итоге расширится U вплоть до keyof T, и это не сможет предотвратить ошибки.

Давайте удостоверимся, что версия здесь работает:

const person = {
    name: 'James',
    age: 13,
}
const setPerson = setItem(person)
setPerson('name', 10); // error
setPerson('name', 'Jill'); // okay
setPerson('age', 10); // okay
setPerson('age', 'Jill'); // error

Детская площадка ссылка на код

Надеюсь, что поможет;удачи!

...