使用useState Argument of type '(previousState: IsProducts) => { list: IsProduct[]; }' is not assignable to parameter of type 'IsProducts'.
时出现以下TypeScript错误
我不太确定类型的问题是什么。如果有人能给我指出正确的方向,我将不胜感激:)
export interface IsProduct {
name: string;
price: number;
quantity: number;
}
export interface IsProducts {
list: IsProduct[];
}
const [products, setProducts] = useState<IsProducts | undefined>({
list: [
{
name: 'Test One',
price: 20,
quantity: 2,
},
{
name: 'Test Two',
price: 10,
quantity: 1,
},
],
});
setProducts((previousState: IsProducts) => {
return {
...previousState,
list: previousState.list.map((product: IsProduct, idx: number) => {
if (idx === index) {
return {
...product,
quantity: product.quantity >= 10 ? (product.quantity = 10) : product.quantity + 1,
};
}
return product;
}),
};
});
从IsProductContext
中删除setProducts
会删除上述错误,但会在上下文中引发不同的错误。
export interface IsProductContext {
products: IsProducts;
setProducts: (products: IsProducts) => void;
}
2条答案
按热度按时间dvtswwa31#
调用useState时,使用IsProducts对其进行了参数化|undefined,然后当你调用setProducts时,你有previousState:IsProducts。您的类型不匹配。
w8biq8rn2#
展开注解。使用
useState
创建setProducts
:在这一点上,
setProducts
有这个有点不透明和无用的类型:检查React类型,你可以确认这些是更熟悉的结构的别名:
毫无疑问,我们可以使用
IsProducts | undefined
值或返回IsProducts | undefined
值的函数来调用setProducts(..)
。您的上下文类型为:
上下文中的
setProducts
与useState
返回的setProducts
具有不同的类型-context.setProducts
只声明它接受IsProducts
值,而不是回调形式。当您为它提供回调值时,Typescript正确地报告错误。如果你更新了上下文类型,以匹配
useState
返回的setter的React类型…那你就没事了
顺便说一下,在我的项目中,我通常会为这些类型的状态更新函数设置几个别名,以便将它们与React解耦。
在这种情况下,您上下文中将有
setProducts: StateSetter<IsProducts | undefined>
。