提问者:小点点

为什么JavaScript中的一段有效代码会在TypeScript&React中产生映射函数错误?


目前,我正在尝试构建一个带有React和Typescript组合的前端页面。 我尝试做的是通过axios的get方法获取“单词”,并将数据分配给一个数组,然后在前端页面上显示它,这非常简单。 我已经确保后端部分使用邮递员工作良好。

由于我没有找到一个很好的“React&;Typescript”教程与我想做的完全匹配,我正在学习“React&;JavaScript”教程。 我觉得有点奇怪的是,在“React&;JavaScript”中编写的完全有效的部分导致了一个错误“TypeError:this.state.WordsData.Map is not a function”,在我的例子中,这个错误是在“React&;TypeScript”中编写的。

这是我的密码。

import React from 'react';
import axios from 'axios'
import Word from '../interfaces/Word.interface';

class Home extends React.Component{

  state = {
    wordsData:new Array<Word>()
  }

  componentWillMount(){
    axios.get('http://localhost:8080/pictionarizerservices/api/words')
    .then(res => {
      const data = res.data;
      console.log("The content of res: ");
      console.log(res);
      this.setState({
        wordsData:{
          id: data.id,
          ownLangWordName: data.ownLangWordName,
          targetLangWordName: data.targetLangWordName,
          ownLangExSentence: data.ownLangExSentence,
          targetLangExSentence: data.targetLangExSentence,
          createdDate: data.createdDate
        }
      })
    })
  }

  render(){
    return(
      <div>
        <h2>Words:</h2>
        <table>
          <th>ID</th>
          <th>Word (OL)</th>
          <th>Word (TL)</th>
          <th>Sentence (OL)</th>
          <th>Sentence (TL)</th>
          <th>Created Date</th>
        </table>
        <tbody>
          {this.state.wordsData.map(singleWord=>
          <RowCreator 
            id={singleWord.id}
            ownLangWordName={singleWord.ownLangWordName}
            targetLangWordName={singleWord.targetLangWordName}
            ownLangExSentence={singleWord.ownLangExSentence}
            targetLangExSentence={singleWord.targetLangExSentence}
            createdDate={singleWord.createdDate}
            />)}
        </tbody>
      </div>
    )
  }
}

class RowCreator extends React.Component<Word>{

  render(){
    let word = this.props;
    return(
      <div>
        <tr>
          <td>{word.id}</td>
          <td>{word.ownLangWordName}</td>
          <td>{word.targetLangWordName}</td>
          <td>{word.ownLangExSentence}</td>
          <td>{word.targetLangExSentence}</td>
          <td>{word.createdDate}</td>
        </tr>
      </div>
    )
  }
}

export default Home; 

为了适应TypeScript,我修改了一些语法,但以下是我修改的全部内容。

发件人

state = {
    patientData:[]
}

  state = {
    wordsData:new Array<Word>()
  }

,并从

class RowCreator extends React.Component{
...

class RowCreator extends React.Component<Word>{
...

仅此而已。

通过自学TypeScript,我已经知道TypeScript是JavaScript的严格超集,所有用JavaScript编写的有效代码在TypeScript中也应该是有效的。 另外,特别是在用Visual Studio编写代码时,Typescript的错误检测功能非常出色,与用JavaScript编写代码相比,您可以提前发现更多的错误。 在运行程序之前,我确保所有的错误标记都被删除了,现在我得到了这个“TypeError:this.state.WordsData.Map is not a function”错误作为运行时错误。

我怎样才能得到这个角色

<tbody>
          {this.state.wordsData.map(singleWord=>
          <RowCreator 
            id={singleWord.id}
            ownLangWordName={singleWord.ownLangWordName}
            targetLangWordName={singleWord.targetLangWordName}
            ownLangExSentence={singleWord.ownLangExSentence}
            targetLangExSentence={singleWord.targetLangExSentence}
            createdDate={singleWord.createdDate}
            />)}
        </tbody>

做打字稿?


共1个答案

匿名用户

您正在将其设置为对象

  this.setState({
    wordsData:{
      id: data.id,
      ownLangWordName: data.ownLangWordName,
      targetLangWordName: data.targetLangWordName,
      ownLangExSentence: data.ownLangExSentence,
      targetLangExSentence: data.targetLangExSentence,
      createdDate: data.createdDate
    }
  })

将其设置为一个数组,如下所示:

  this.setState({
    wordsData:[{
      id: data.id,
      ownLangWordName: data.ownLangWordName,
      targetLangWordName: data.targetLangWordName,
      ownLangExSentence: data.ownLangExSentence,
      targetLangExSentence: data.targetLangExSentence,
      createdDate: data.createdDate
    }]
  })