Проблема onClick с typescript 3.33 и react

#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. Это выглядит прямо сейчас, единственная придирка, я бы сказал, «вызывается способом», не обязательно «привязанным способом»