打字稿错误类型无法分配给状态 - usestate

Posted

技术标签:

【中文标题】打字稿错误类型无法分配给状态 - usestate【英文标题】:Typescript error type not assign able to state - usestate 【发布时间】:2020-08-25 03:53:09 【问题描述】:

我是键入脚本的新手,我正在尝试使用使用状态挂钩和键入脚本来设置响应状态。

const intialState: State =
    items: [],
    value: "",
    error: null


const [data, setData]= useState([intialState]);

return (
    <>
        
            data.items.map(x) => (
                //my html component to be displayed.
            )
        
    </>
)

但我收到以下错误。 谁能告诉我。

    像我所做的那样在 usestate 中设置对象是否有效? 为什么我收到 typescript 错误?

【问题讨论】:

您的州类型是什么样的?错误基本上是说您的 State type(interface, class) 没有名为 items 的属性 实际上我试图将一个新状态创建为空对象,那么我应该在那里定义什么类型?对象是有效类型吗? 我们能看看State 的样子吗? 另见:Set types on useState React Hook with TypeScript 【参考方案1】:

首先,我们应该检查StateinitialState 对象之间是否存在接口不匹配。如果您可以发布State 的类型定义,将会有所帮助。

此外,您应该为useState 钩子提供State[] 的泛型类型参数

const [data, setData]= useState<State[]>([intialState]);

【讨论】:

【参考方案2】:

我想这就是你试图达到的目标。确保正确定义 State 类型,而不是从其他包中导入

interface State 
    items: any[];
    value: string;
    error: string | null;



const MyComponent: (props) => 
    const intialState: State =
        items: [],
        value: "",
        error: null
    
    const [data, setData] = useState(intialState)


return (
   <>
        
            data.items.map(x) => (
                //my html component to be displayed.
            )
        
    </>
    )

【讨论】:

【参考方案3】:

您需要为 useState 指定类型。由于它是您的状态对象的数组,您可以像这样编写它

const [data, setData]= useState<State[]>([intialState]);

还要确保为状态对象定义类型

interface ErrorType 
   status: Number // more keys and their types here

interface MyDataType 
  items: ItemType[],
  error: ErrorType | null,
  value: string,

发布您可以将它与 useState 类似的使用

const [data, setData]= useState<MyDataType[]>([intialState]);

您的数据是一个对象数组,当您更新状态时,您需要合并这些值。为此,您可以使用功能 setState

var updatedDataObj =  items: ["a","b","c"], error: "404", value: "xyx", ;
setData(prevData => [...prevData, updatedDataObj]);

【讨论】:

感谢您的回复,请您告诉我 setData 与多个对象的语法是什么。 var updatedDataObj = 项目:[“a”,“b”,“c”],错误:“404”,值:“xyx”,;设置数据(更新数据对象);这是正确的吗? 您要合并对象还是仅替换它们。数据也是一个对象数组,所以我假设您想向其中添加更多对象。那是对的吗?或者你只是想在状态中存储一个对象而不是一个对象数组? 是的...我想添加更多对象。所以基本上我正在尝试将codesandbox.io/embed/ypyxr11109 这个示例转换为使用 usestate 钩子的可重用组件 我据此更新了我的答案。请检查 您能否为上述示例提供一个小sn-p或使用usestate的小提琴。

以上是关于打字稿错误类型无法分配给状态 - usestate的主要内容,如果未能解决你的问题,请参考以下文章

打字稿,JSON.parse 错误:“类型 'null' 不可分配给类型 'string'。”

打字稿错误:类型“文档 []”不可分配给自定义类型

具有通用方法和继承的打字稿工厂,错误不可分配给类型

使用反应成帧器类型'()=> void'的打字稿错误不可分配给类型'未定义'

打字稿错误:类型 'string' 不可分配给类型 '"allName" | `allName.$number.nestedArray`' 在反应钩子形式

无法让嵌套类型保护与打字稿中的联合类型一起使用