微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第0行:解析错误:无法读取未定义的属性“地图””-TypeScript自定义钩子

如何解决第0行:解析错误:无法读取未定义的属性“地图””-TypeScript自定义钩子

我遇到了一个错误“ ./src/hooks/usePagination.tsx第0行:分析错误:无法读取未定义的属性'map'”您知道这是什么原因吗?我花了半个晚上寻找关于stackoferflow等的答案,但尝试了许多失败的尝试。

首先我考虑了我的数据格式,因为现在是

[
    {"id":1,"firstName":"Cori","lastName":"Wescott","email":"cwescott0@etsy.com","gender":"Male","ip_address":"236.58.118.85"},{"id":2,"firstName":"Teena","lastName":"Kedge","email":"tkedge1@ameblo.jp","gender":"Female","ip_address":"74.32.179.20"},{"id":3,"firstName":"Englebert","lastName":"Menlove","email":"emenlove2@cmu.edu","ip_address":"91.249.51.126"},]

,我更改了数据而不是json,但这没有帮助。后来我寻找了错误标记,字母,字符,无论如何-没有结果。最后,我的研究促使我阅读有关npm或其他软件包的旧版本。恩,我现在放弃。.

也许有人会发现问题。

function App() {
  const [paginationState,paginationActions] = usePagination(dataEntries,2);
  return (
    <div className="App">
      <h2>Users</h2>
      { !paginationState.isBusy && <PaginatedTable dataEntries={paginationState.entries}/> }
      <Pagination state={paginationState} actions={paginationActions}/>
    </div>
  );
}

export default App;
d.ts file

export interface User {
  id: number
  firstName: string
  lastName: string
}

export interface PaginationState<T> {
  lastPageIdx: number
  actualPageIdx: number
  entries: T[]
  isBusy: boolean
}

export interface PaginationActions {
  goToFirstPage: () => void
  goToPrevPage: () => void
  goToNextPage: () => void
  goToLastPage: () => void
  goToPage: (number: number) => void
}

自定义钩子

function usePagination<T>(dataEntries: T[],elementsOnPage: number): [PaginationState<T>,PaginationActions] {
  const [actualPageIdx,setActualPageIdx] = useState(1)
  const lastPageIdx = Math.ceil(dataEntries.length / elementsOnPage)
  const [isBusy,setIsBusy] = useState(false)

  useEffect(() => {
    setIsBusy(true)
    let timer = setTimeout(() => {
      setIsBusy(false)
      clearTimeout(timer)
    },333)

    return () => {
      clearTimeout(timer)
    }
  },[actualPageIdx])

  const entriesOnSelectedPage = () => {
    const firstEntry = (actualPageIdx - 1) * elementsOnPage
    const lastEntry = firstEntry + elementsOnPage
    return dataEntries.slice(firstEntry,lastEntry)
  }

  const entries = entriesOnSelectedPage()

  const goToFirstPage = () => {
    setActualPageIdx(1)
  }

  const goToLastPage = () => {
    setActualPageIdx(lastPageIdx)
  }

  const goToPage = (page: number) => {
    setActualPageIdx(page)
  }

  const goToPrevPage = () => {
    setActualPageIdx((actualPageIdx) => (actualPageIdx === 1 ? actualPageIdx : actualPageIdx - 1))
  }

  const goToNextPage = () => {
    setActualPageIdx((actualPageIdx) =>
      actualPageIdx === lastPageIdx ? actualPageIdx : actualPageIdx + 1
    )
  }
  
  return [
    { 
      actualPageIdx,lastPageIdx,entries,isBusy 
    },{
      goToFirstPage,goToPrevPage,goToPage,goToNextPage,goToLastPage,},] 
}

分页

interface PaginationProps {
  state: PaginationState<User>
  actions: PaginationActions
}

const Pagination: FC<PaginationProps> = ({ state,actions }) => {
  const pageNumbers = []

  for (let i = 1; i <= state.lastPageIdx; i++) {
    pageNumbers.push(i)
  }

  const renderPagination = pageNumbers.map((number) => (
    <button
      key={number}
      onClick={() => actions.goToPage(number)}
      className={
        state.actualPageIdx === number ? styles.actualIdxStyle : styles.paginationStyle
      }
    >
      {number}
    </button>
  ))

  return (
    <div className={styles.paginationContainer}>
      <button onClick={actions.goToFirstPage}>GO TO FirsT</button>
      <button onClick={actions.goToPrevPage} data-testid="goToPrevPage">
        <i className="fas fa-chevron-left"></i>
      </button>
      <div data-testid="goToPageButtons">{renderPagination}</div>
      <button onClick={actions.goToNextPage} data-testid="goToNextPage">
        <i className="fas fa-chevron-right"></i>
      </button>
      <button onClick={actions.goToLastPage}>GO TO LAST</button>
    </div>
  )
}

PaginatedTable

interface PaginatedTableProps {
  dataEntries: User[]
}

const PaginatedTable: FC<PaginatedTableProps> = ({ dataEntries }) => {
  const tableEntry = dataEntries && dataEntries.map(({ id,firstName,lastName }) => (
    <div key={id} className={styles.tableStyle}>
      <p>
        {id}{'. '}
      </p>
      <p>
        {firstName} {lastName}
      </p>
    </div>
  ))
  return (
    <div>
      <div className={`${styles.tableStyle} ${styles.headStyle}`}>
        <p>No.</p>
        <p>Name</p>
      </div>
      <div data-testid="users">{tableEntry}</div>
    </div>
  )
}

解决方法

可以确认上面评论中提到的@radicand。 以下软件包需要降级到这些版本:

"@typescript-eslint/eslint-plugin": "3.9.1","@typescript-eslint/parser": "3.9.1","typescript": "3.9.2"

Typescript 4.x和eslint 4.x软件包不适用于3.4.3。的react-scripts。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。