【发布时间】:2021-05-19 17:09:56
【问题描述】:
我正在尝试在我的 React 项目中学习使用 TypeScript。
我为传入的数据格式(名称和网址)做了一个类型。
type PokedexType = {
name: string;
url: string;
}
API 返回的数据是一个对象数组(带有名称和 url)。
{
"results": [
{
"name": "national",
"url": "https://pokeapi.co/api/v2/pokedex/1/"
},
{
"name": "kanto",
"url": "https://pokeapi.co/api/v2/pokedex/2/"
},
// ...
];
}
在我的useEffect() 中,我将这些对象存储在setState() 的状态中。
useEffect(() => {
api.get('/pokedex')
.then((response) => {
setPokedex(response.data.results);
})
.catch((error) => {
console.log(error);
});
});
由于 API 返回一个数组,我对设置 useState() 的正确方法感到困惑。
// this works
const [pokedex, setPokedex] = useState<Array<PokedexType>>([{ name: "", url: "" }]);
// these also work
const [pokedex, setPokedex] = useState<PokedexType>({ name: "", url: "" });
const [pokedex, setPokedex] = useState<Array<PokedexType>>();
const [pokedex, setPokedex] = useState(); // (with checking)
我知道指定类型是为了类型检查,但是如果状态立即被覆盖,这有关系吗?
我正在尝试将州名称 (i.name) 设置为我的选择的值,正确的方法是什么?既然 state 现在是一个数组,那么如何将值设置为相应的属性(像这样)?
<select value={pokedex.name}>
【问题讨论】:
-
我不完全确定我理解你的问题。您是在问使用类型的意义何在?关于如何使用状态更改数组中项目的值,您还有第二个问题吗?
-
不应该
useState<Array<PokedexType>>([{ name: "", url: "" }]);只是useState<PokedexType[]>([{ name: "", url: "" }]);? -
@azium 他们确实是两个独立的问题,我会尽量说清楚
-
@kimbaudi 两种方式都做同样的事情(
arrname[]和Array<arrname>) -
默认 linter 规则是非复杂类型(即单个预定义类型)应该使用
type[],复杂类型(定义内联/复合类型)应该使用Array<{ name: string; url: string; }>或@987654336 @。我不知道这是否是一个仅偏好的 linter 规则,还是与类型解析速度有关。
标签: javascript arrays reactjs typescript select