【发布时间】:2021-06-30 15:07:40
【问题描述】:
我第一次尝试使用一个简单的 React 应用程序,并希望设置一个简单的 MVC 来连接 ASP.NET 后端,所有这些都是在 Visual Studio 2019 中完成的(这让 React 有些头疼)。但是,现在我正在尝试实现模型,我发现所有强类型化 useState 挂钩的建议都对我不起作用。
根据this one 或this one 之类的一些教程,它应该像在括号中添加一个类型一样简单,例如const [state, setState] = useState<Type>({}),因为它具有通用实现。不幸的是,对我来说,这会引发错误“Uncaught TypeError: Invalid attempt to destructure non-iterable instance.”
该线程here 建议通过将 [] 更改为 {} 从数组切换到对象,但这只会使我传递的两个参数未定义,因此我没有状态或方法来更新所述状态。
我一直在阅读,直到我对数组解构有了一个简要的了解,所以我明白这个想法是传递一个包含两个常量的数组,这两个常量将按顺序分配 useState 返回的数组元素钩。因此,我尝试手动解构数组,分别设置常量useState[0] 和useState[1]。当我为无类型的钩子尝试这个时,它按预期工作。当我为 typed hook 尝试这个时,我得到了一些关于没有元素的错误,并且在打印出对象时,发现不是像 untyped hook 这样的数组,而是一个布尔值。似乎类型化的 useState 返回值“false”而不是数组。
在这一点上,我最好的猜测是我有一些依赖项没有实现类型化的 useState,但我在故障排除方面确实遇到了障碍。有人知道我做错了什么吗?
编辑:我设置的测试文件 -
import React, { useState } from 'react'
import 'bootstrap/dist/css/bootstrap.min.css';
import { Product } from '../Models/Product';
const Account = () => {
//Works as-intended
const test = useState(5);
//Returns false when logged
const test2 = useState<Product>({
"ProductID": "p#corn", "Description": "Delicious corn", "ImageLink": "https://testlink.com", "Name": "Corn", "Price": "2.99", "Category": "Food"
});
//What should work, to my understanding, however this makes the route crash when it's navigated to because of the "Inavlid attempt to destructure non-iterable instance
const [test3, setTest] = useState<Product>({});
function clickHandler() {
console.log(test)
}
function clickHandler2() {
console.log(test2)
}
return (
<div className='wrapper'>
<button onClick={clickHandler}>Test</button>
<button onClick={clickHandler2}>Test2</button>
</div>
)
}
export default Account;
产品模型 -
export interface Product {
ProductID: string;
Description: string;
ImageLink: string;
Name: string;
Price: string;
Category: string;
}
【问题讨论】:
-
你能分享你的代码吗?如果无法进行调查,很难想象其他代码可能会导致这个错误。您的 useState 导入来自哪里,它在哪里被调用。添加类型不应该真正改变打字稿转译的javascript代码,它只会改变编译器是否允许它没有错误。
-
@cefn 虽然我一直是个潜伏者,但这是第一次真正发帖,所以我不完全确定做事的正确方法。我将它添加为代码 sn-p,但如果效果更好,我可以做截图。我也没有包含任何配置文件,但我在 package.json 中有 React 17.0.2,所以我猜这就是导入的内容。感谢您的观看!
-
更奇怪的是,正如你所说的第一行 useState 做了你认为的意图,因为它应该返回一个数组,首先包含一个值,然后是一个 setter,而不是一个值。我开始怀疑您的环境是否设置了一些 JSX 配置,这意味着它根本没有将
<Product>解释为 typescript Generic,而是其他东西,比如 HTML 元素或其他东西。它当然似乎特定于您的环境或配置。我将整理一个 CodeSandbox,这可能是您了解世界其他地方的真实情况的好方法。 -
使用
console.log(useState<Product>({}))时会打印什么; -
@cefn 不仅是
<Product>,它还有更通用的类型,如<Number>和<Boolean>,但 JSX 配置似乎确实是罪魁祸首,因为我不得不从几个不同的教程拼凑而成。
标签: reactjs typescript use-state