typescript - 类型上不存在属性“标题”?
问题描述
通过 23 行,我得到此属性 'title' 在类型 'faceProductList | 上不存在 faceProductList[]'为什么会出现这样的错误来解决呢?
interface faceProductList {
readonly title: string;
readonly price: string;
readonly prodState: string;
readonly shipping: string;
readonly sold: string;
readonly src: string;
readonly id: string;
readonly to: string;
}
class Server {
private url: string = 'https://foo0022.firebaseio.com/';
public async request(id: string): Promise<(faceProductList[] | faceProductList)[]> {
const res = await fetch(`${this.url}${id}`);
const resArr: (faceProductList[] | faceProductList)[] = await res.json();
return resArr;
}
public async handler(id: string, valueSearch: string) {
await this.request(id)
.then((array) => {
if(id){
return array.filter(({title}) => title.includes(valueSearch))
}
})
}
}
解决方案
您的请求将返回 a (faceProductList[] | faceProductList)[]
,这意味着每个数组项是 afaceProductList
或数组faceProductList
。该错误告诉您如果要过滤的项目是数组,则过滤器不起作用。
根据您的确切要求,您可以在过滤之前展平结果集:
return array
.reduce((acc: faceProductList[], cur) => (Array.isArray(cur) ? acc.concat(cur) : acc.push(cur), acc), [])
.filter(({ title }) => title.includes(valueSearch))
或者你可以重写你的过滤条件来处理这两种情况:
return array
.filter((item) => Array.isArray(item)
? item.some(({ title }) => title.includes(valueSearch))
: item.title.includes(valueSearch))
如果先将其展平并将其保存到单独的变量中,则可以更简洁地编写它:
const flatArray = array.reduce((acc: faceProductList[], cur) => (Array.isArray(cur) ? acc.concat(cur) : acc.push(cur), acc), []);
if (id) {
return flatArray.filter(({ title }) => title.includes(valueSearch));
}
return flatArray;
推荐阅读
- c# - itext7 pdfstream未压缩
- flutter - 如何根据应用平台在 Flutter 应用中拆分 Cupertino/Material?
- amazon-web-services - AWS Lambda 无权执行权限中列出的操作
- express - 如何部署使用 Express Router 的 Express 应用程序
- python-3.x - “ValueError:'c' 参数有 28 个元素,不能与大小为 33 的 'x'、大小为 33 的 'y' 一起使用”与 Networkx k-partite graph
- python - 函数只返回一次迭代,而不是多次。怎么了?
- c - 我如何判断输出是否是C中的整数
- dataframe - 规范化和非规范化数据框中的行
- rpy2 - 如何修复 Windows 8.1 上的 init rpy2 - Rblas 丢失?
- firebase - Firestore 双字段查询请求(和 GeoPoint)