reactjs React类型脚本-类型“User”不能分配给类型“never”

yzxexxkh  于 2023-02-22  发布在  React
关注(0)|答案(1)|浏览(186)

我这里有一个stackBlitz演示
https://stackblitz.com/edit/react-ts-opucum?file=UserList.tsx,App.tsx
我正在遵循一个简单的react教程,创建一个简单的应用程序,你输入一个名字和电子邮件,它就显示在下面。
这个教程是js的,但是我想用ts来做。
我有一个用户表单,您可以在其中输入姓名和电子邮件
我正在传入onUserAdd,它在App.tsx上用于将数据添加到本地状态

import React, { FormEvent, useState } from 'react';

const UserForm = ({ onUserAdd }: any) => {
  const [email, setEmail] = useState('');
  const [name, setName] = useState('');

  const handelSubmit = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    onUserAdd({ name, email });
  };

  return (
    <form onSubmit={handelSubmit}>
      <div>
        <label>Name</label>
        <input
          type="text"
          value={name}
          onChange={(e) => setName(e.target.value)}
        />
      </div>
      <div>
        <label>Email</label>
        <input
          type="text"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        />
      </div>
      <button type="submit">Add User </button>
    </form>
  );
};

export default UserForm;

我有一个UserList,它接收用户并将其显示在列表中,这里我设置了{users}:User,但它显示为Property 'users' does not exist on type 'User'.

import React from 'react'

export interface User{
  name:string
  email: string
}

const UserList = ({users}:User) => {
  return (
    <table>
    {users.map((user:User) => {
      return(
        <tr>
          <td>{user.name}</td>
          <td>{user.email}</td>
        </tr>
      )
    })}
    </table>
  )
}

export default UserList

最后,我有一个应用程序.tsx,这里[...users, user]表示Type 'User' is not assignable to type 'never'.users={users}表示Type '{ users: never[]; }' is not assignable to type 'IntrinsicAttributes & User'. Property 'users' does not exist on type 'IntrinsicAttributes & User'.

import React, { useState } from 'react';
import './App.css';
import UserForm from './UserForm';
import UserList, { User } from './UserList';

const App = () => {
  const [users, setUsers] = useState([])
  const onUserAdd = (user:User) => {
    setUsers([...users, user])
  }
  return (
    <>
      <UserForm onUserAdd={onUserAdd}/>
      <UserList users={users}/>
    </>

  );
}

export default App;

我知道这里有很多问题,但我敢肯定,这是我搞砸了类型。
有人知道如何简单地解决这个问题吗

wz3gfoph

wz3gfoph1#

因为没有设置useState中的用户,所以typescript将其设置为never[],表示一种空数组类型。

const [users, setUsers] = useState<User[]>([])

将其设置为User[](用户数组)后,需要修复此类型,因为它只需要一个用户,但您需要用户数组

const UserList = ({users}:User[]) => {
//
})

您无需键入此部件,它现在已从User[]中知道其类型

{users.map((user) => {
    //
    })}

相关问题