下面是我的代码
const Res = await fetch(`https://foo0022.firebaseio.com/.json`);
const ResObj = await Res.json();
if (!Res.ok || !ResObj) {
throw new Error("Page Not Found 404");
}
const ResArr = await Object.values(ResObj)
.map(v => Object.values(v).flat())//error
.flat()
.filter(({ title }) => title.includes(Search))
在行中在我得到这个错误的行中". map(v =〉Object. values(v). flat())"我得到这个错误类型'unknown'的参数不能赋值给类型'{}'的参数。
2条答案
按热度按时间abithluo1#
这里的问题是,你需要帮助TypeScript理解你所处理的对象的类型,
fetch
API无法提前知道返回对象的形状,所以你必须定义它并Assert结果符合它。看看https://foo0022.firebaseio.com/.json上的内容,我会提出如下建议:
当然,这是否准确取决于某种API文档。假设这是正确的,您可以更进一步:
现在
ResObj
将被称为类型ResObj
,你可以开始操作它了。一个问题是Object.values()
和Array.prototype.flat()
的标准库的类型并不反映你对它们所做的事情。我们可以为它们构建一些自定义类型......但是在本例中,我将用类型匹配的新函数 Package 它们:如果您以前从未使用过TypeScript,这些函数的类型可能会令人困惑,尤其是因为它们依赖于条件类型来梳理数组属性。
然后我们可以像这样重写代码:
并且没有错误,编译器理解
ResArr
是Clothing
对象的数组。链接到代码
好吧,希望能有所帮助;祝你好运!
inn6fuwd2#
问题
Res.json()
返回any
类型的值,当Object.values
接收any
类型的输入时,它返回unknown[]
。当strictNullChecks
打开时,TypeScript不允许我们将unknown
类型的值赋给{}
类型的参数。这一解释也附在评论中。
两种可能的解决方案
1.禁用
strictNullChecks
(不推荐)。1.将类型添加到
ResObj
。后一个选项如下所示: