#typescript
#typescript
Вопрос:
Я пытаюсь использовать свойство onClick для ссылки с TypeScript и React:
import * as React from 'react';
import { any } from 'prop-types';
function handleClick(this:any,name:React.ReactNode) {
console.log('The link was clicked.');
this.props.callbackFromParentSearch(name);
}
export const Suggestions = (props:any) => {
const options = props.results.map((r: { id: React.Key; name: React.ReactNode; }) => (
<a href="#" onClick={handleClick(r.name)}>
<li key={r.id}>
{r.name}
</li>
</a>
))
return <ul>{options}</ul>
}
export default Suggestions
Но это выдает ошибку:
Тип ‘void’ нельзя присвоить типу ‘(событие: MouseEvent) => void’.ts(2322) index.d.ts(1315, 9): ожидаемый тип определяется свойством ‘onClick’, которое объявлено здесь в типе ‘DetailedHTMLProps, HTMLAnchorElement>’
Итак, как правильно использовать событие onClick в TypeScript amp; React?
Ответ №1:
Вам нужно передать функцию:
onClick={() => handleClick(r.name)}
Однако даже при этом ваш код не будет работать, потому что ваша handleClick
функция требует привязки таким образом, чтобы она this
была объектом, содержащим ваши реквизиты. В вашем коде это не так.
Ваш компонент должен работать таким образом:
export const Suggestions = (props:any) => {
const options = props.results.map((r: { id: React.Key; name: React.ReactNode; }) => (
<a href="#" onClick={() => props.callbackFromParentSearch(r.name)}>
<li key={r.id}>
{r.name}
</li>
</a>
))
return <ul>{options}</ul>
}
или вот так:
function handleClick(props: any, name: React.ReactNode) {
console.log('The link was clicked.');
props.callbackFromParentSearch(name);
}
export const Suggestions = (props:any) => {
const options = props.results.map((r: { id: React.Key; name: React.ReactNode; }) => (
<a href="#" onClick={() => handleClick(props, r.name)}>
<li key={r.id}>
{r.name}
</li>
</a>
))
return <ul>{options}</ul>
}
Комментарии:
1. На самом деле в TypeScript допускается
this
объявление типа в качестве первого параметра (первый параметр будет опущен в скомпилированном JS). Таким образом, эта часть кода допустима, даже если другие части таковыми не являются.2. Я не говорил, что это недопустимо. Но это не сработало вместе с тем, как он это назвал.
3. Неверно говорить, что «вашей функции handleClick требуются два параметра». Требуется только один, поскольку
this
параметр не включен в скомпилированный вывод .4. Понятно, спасибо за разъяснение. Это все равно бы не сработало, верно? Я обновил свой ответ, чтобы быть более точным. Можете ли вы согласиться с этим?
5. Это выглядит прямо сейчас, единственная придирка, я бы сказал, «вызывается способом», не обязательно «привязанным способом»