Это стоит немного разбить, потому что это довольно познавательно. Получение свойства string
из object
- это что-то вроде частичной функции; некоторые комбинации свойств и объектов могут возвращать значения, но не все.
В вашем примере получение свойства с типом string
(name
) из типа iconsList
не гарантирует ценность; что, если string
это "xyz"
? Каким должно быть значение в таком случае? На этот вопрос сложно дать конкретный ответ.
Если мы посмотрим на сокращенный пример, то увидим ту же ошибку:
const getIcon = (iconName: string) => {
const iconsList = {
heart: '',
star: '',
};
return iconsList[iconName];
};
Выдает ту же ошибку в строке return iconsList[iconName];
Мы можем сделать лучше, чтобы эта работа работала. Если мы хотим сказать, что переданный нами iconName
всегда будет свойством объекта iconsList
, мы можем сделать это через. тип:
const iconsList = {
heart: '',
star: '',
};
const getIcon = (iconName: keyof typeof iconsList) => {
return iconsList[iconName];
}
const x = getIcon('heart'); // works
const y = getIcon('xyz'); // type error
... и мы можем получить более общие c с этим:
const path = <T>(o: T) => (k: keyof T) => o[k];
const iconsList = {
heart: '',
star: '',
};
const getIcon = path(iconsList);
const x = getIcon('heart'); // works
const y = getIcon('xyz'); // type error
Если вы хотите всегда возвращать полезное значение, несмотря ни на что входные данные, обратите внимание на тип возвращаемого значения Maybe
; таким образом, вы всегда можете вернуть Maybe
, которое будет Nothing
, если вы не можете получить ключ на объекте.
Надеюсь, это даст представление о том, почему вы получаете ошибку и как можно это исправить. Если у вас есть какие-либо вопросы, задавайте их.
Обновить согласно комментарию:
Вы должны убедиться, что вы также устанавливаете тип Props
в чтобы мы могли использовать его для доступа iconTypes
:
const iconsList = {
heart: '',
star: '',
like: '',
dislike: '',
flash: '',
marker: '',
filter: '',
user: '',
circle: '',
hashtag: '',
calendar: '',
chevronLeft: '',
optionsV: '',
optionsH: '',
chat: '',
explore: ''
};
interface Props{
name: keyof typeof iconsList;
}
etc.