reactjs - 由于 'Type '元素,React TypeScript无法对表进行排序元素'无法分配给 'string' .ts(2345)'类型

标签 reactjs typescript sorting compiler-errors

我在对React组件中的表进行排序时遇到问题。该问题与 typescript 有关,并且突出显示了参数并显示错误,即:'类型'(name1:string,name2:string)=> number'的参数无法分配给类型'(a:Element,b:元素)=>数字”。参数'name1'和'a'的类型不兼容。类型“元素”不可分配给类型“字符串”。
我的父组件:

const SearchWithDropdown: React.FC = () => {
  const [countries, setCountries] = useState<Array<Country>>([])
  const [value, setValue] = useState('')
  const [filteredCountries, setFilteredCountries] = useState<Array<Country>>([])
  const [isVisible, setIsVisible] = useState(false)

  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { value } = event.target
    setValue(value)
    changeResultVisibility(value)
  }

  const changeResultVisibility = (value: string) => {
    setIsVisible(value.length >= 3)
  }

  useEffect(() => {
    const fetchMyAPI = async () => {
      let response = await fetch(url)
      const json = await response.json()
      setCountries(json)
    }
    fetchMyAPI()
  }, [])


  useEffect(() => {
    if (value.length >= 3 && countries.length > 0) {
      setFilteredCountries(
        countries
          .filter((el: Country) => el.name.toLowerCase().includes(value))
      )
    }
  }, [value, countries])

  console.log(filteredCountries)

  return (
    <div>
      <input type="text" placeholder="Search..." value={value} onChange={handleChange}></input>
      {isVisible ? (
        filteredCountries.length > 0 ? (
          <DropdownList filteredCountries={filteredCountries} value={value} />
        ) : (
          <div>Not found!</div>
        )
      ) : null}
    </div>
  )
}
和子组件:
interface DropdownListProps {
  filteredCountries: Country[]
  value: string
}

function sortData (name1: string, name2: string): number {
  name1 = name1.toLowerCase()
  name2 = name2.toLowerCase()
  return name1 > name2 ? 1 : name2 > name1 ? -1 : 0
}

const DropdownList: React.FC<DropdownListProps> = ({ filteredCountries, value }) => {
  const renderData = () =>
    filteredCountries
    .map((el) => (
      <DropdownItem key={el.name}>
        {reactStringReplace(el.name, value, (match: string, i: number) => (
          <strong key={i}>{match}</strong>
        ))}
      </DropdownItem>
    ))
    .sort(sortData)

  return <div>{renderData()}</div>
}
和我的d.ts文件:
export interface Country {
  name: string
}
我试图通过更改d.ts文件中的声明来解决此问题,但这听起来有些愚蠢。我是TS的新手,所以也许我在这个地方进行排序的假设是错误的。也许应该在父组件中的过滤方法之后。
非常感谢您的帮助!

最佳答案

看来您的排序函数接收到元素,导致您使用 map 方法修改了国家数组,并返回了 DropdownItem 的数组。
因此,我建议在将数据传递给DropdownItem组件之前进行排序。
另外,filteredCountries 的项也是具有属性名称({name:string})的对象,因此您的排序功能将接收该对象并应从中提取name属性

function sortData (c1: Country, c2: Country): number {

关于reactjs - 由于 'Type '元素,React TypeScript无法对表进行排序元素'无法分配给 'string' .ts(2345)'类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63518797/

相关文章:

Angular 2 : pass a value to the route data resolve

typescript - 如何在 typescript 中提取函数的类型?

javascript - 在 ReactJs 中创建动态 svg 图标组件

javascript - 每个 React 组件都应该有自己的样式表吗?

typescript - 作为 Prop 传递与提取缓存 Apollo 客户端 Nextjs

linux - 如何在 Linux 中使用命令 "find . -type f -ls"获取按时间排序的列表(ASC/DESC)?

C# 自定义排序。所有 N 后跟 ASC 顺序

python - 使用生成器对生成器进行排序?

css - 我在看一个react页面的css sheet,很多类都在使用内容生成图片,但是VSCode中的内容显示是一个 

javascript - 如何在 React js 的功能组件中创建 ref?