Я пытаюсь написать собственный перехватчик реакции, используя TypeScript. Я написал простую вспомогательную функцию, которая помогает мне проверить, есть ли такое свойство в целевом объекте:
export function hasOwnProperty<X extends {}, Y extends PropertyKey>(
obj: X,
prop: Y,
): obj is X & Record<Y, unknown> {
return obj.hasOwnProperty(prop);
}
И я пытаюсь использовать его в своем хуке:
export const useAutocomplete = <T, Y extends PropertyKey>(data: Array<T>, property?: Y) => {
const [query, setQuery] = useState('');
const [results, setResults] = useState<T[]>([]);
const findResults = (element: T) => {
if (property && hasOwnProperty(element, property)) {
return String(element[property])
.toLowerCase()
.includes(query.toLowerCase());
}
return String(element).toLowerCase().includes(query.toLowerCase());
};
// ...other code
};
Проблема в том, что я не могу использовать такие методы, как toLowerCase()
и другие, даже если я проверяю if (typeof obj[property] === 'string')
, это не работает. Вот почему я решил обернуть свой объект в String, и тогда я смогу получить доступ к нужным мне методам. Но я думаю, что это не очень хорошее решение, и хочу спросить, как лучше понять это?