typescript 类型“never[]"缺少以下属性

p3rjfoxz  于 2023-02-25  发布在  TypeScript
关注(0)|答案(1)|浏览(1238)

类型“never[]"缺少以下类型属性

'{ login: string; id: number; node_id: string; avatar_url: string; url: string; }': login, id, node_id, avatar_url, url

我创建了一个组件,它接受ApiUrl并通过axios获取信息,然后为useState User设置状态,之后我可以使用该信息进行结构化并在html中使用该变量
第一节第一节第一节第一节第一次

vc9ivgsu

vc9ivgsu1#

问题出在定义userInfo变量时,使用的代码如下:

const [userInfo, setUserInfo] = useState([]);

当我们编写TypeScript时,我们经常利用强大的编译器。它会在声明时隐式地定义变量的类型。当你用stringnumberboolean,或者原型/类构造函数初始化变量时,这会很有用。这样做的缺点是,我们经常赋值一个变量,但是从不检查TypeScript隐式地赋值给它的数据类型。
在本例中,userInfo变量被隐式赋值为never[]类型。为什么?useState()函数的定义如下:

function useState<T>(value: T): [T, StateSetter] { ... }

StateSetter类型是我编造的,因为我不知道确切的类型(但这对这个问题来说无关紧要)
你所做的就是把[]传递给useState。因为这个数组有0元素,TypeScript会隐式地把它类型化为never[](意味着它是一个永远不会有任何元素的数组。所以在这个例子中,T被赋值给never[],所以useState的返回类型是[never[], StateSetter]
可以通过向useState添加类型参数来修改此设置:

interface UserInfo {
    ...
}

const [userInfo, setUserInfo] = useState<UserInfo[]>([]);

这告诉TypeScript什么类型的信息可以存储在该数组中(如果您要添加任何元素)。

今后员额说明:不要包含代码的屏幕截图。屏幕截图无法阅读,并且试图帮助您的人无法复制/粘贴您的代码。请在问题中包含格式化代码。

您可以使用反勾号来完成此操作:

This is regular text:
`This` will show up as inline code

```javascript
function thisWillShowUpAsJavaScriptCodeBlock() {
    ...
}

这是常规文本:
This将显示为内联代码

function thisWillShowUpAsJavaScriptCodeBlock() {
    ...
}

相关问题