我这里有一个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;
我知道这里有很多问题,但我敢肯定,这是我搞砸了类型。
有人知道如何简单地解决这个问题吗
1条答案
按热度按时间wz3gfoph1#
因为没有设置useState中的用户,所以typescript将其设置为never[],表示一种空数组类型。
将其设置为User[](用户数组)后,需要修复此类型,因为它只需要一个用户,但您需要用户数组
您无需键入此部件,它现在已从User[]中知道其类型