这里的问题是你需要帮助 TypeScript 理解你正在处理的对象的类型。这fetch
API 无法提前知道返回对象的形状,因此您必须定义它并断言结果符合它。
看看有什么https://foo0022.firebaseio.com/.json https://foo0022.firebaseio.com/.json,我建议如下:
interface ResObj {
Mens: {
Hat: Clothing[];
Jacket: Clothing[];
Pants: Clothing[];
Shoes: Clothing[];
Suit: Clothing[];
};
New: Clothing[];
}
interface Clothing {
agility: boolean[];
alt: string;
color: string[][];
id: string;
location?: string; // fix this
Location?: string; // fix this
material: string;
price: string[][];
prodState: string;
saiz: string[][];
shipping: string;
sold: string;
src: string[][];
title: string;
to: string;
}
当然,这是否准确取决于某种 API 文档。假设这是正确的,你可以更进一步:
const Res = await fetch(`https://foo0022.firebaseio.com/.json`);
const ResObj: ResObj | undefined = await Res.json();
if (!Res.ok || !ResObj) {
throw new Error("Page Not Found 404");
}
Now ResObj
将被称为类型ResObj
你就可以开始操纵它了。一个问题是标准库的类型Object.values() https://github.com/microsoft/TypeScript/blob/v3.5.1/lib/lib.es2017.object.d.ts#L22-L32 and Array.prototype.flat() https://github.com/microsoft/TypeScript/blob/v3.5.1/lib/lib.es2019.array.d.ts#L152-L223不要反映你正在和他们一起做什么。我们可以为它们构建一些自定义类型...但在这种情况下,我将用类型匹配的新函数包装它们:
// return an array of all object values...
// if the object is already an array, the output is the same type.
// otherwise it's the union of all the known property types
function vals<T extends object>(
arr: T
): Array<T extends Array<infer U> ? U : T[keyof T]> {
return Object.values(arr); // need es2017 lib for this
}
// Flatten an array by one level...
function flat<T>(
arr: Array<T>
): Array<Extract<T, any[]>[number] | Exclude<T, any[]>> {
return arr.flat(); // need esnext lib for this
}
如果您以前从未使用过 TypeScript,这些函数类型可能会令人困惑,特别是因为它们依赖于条件类型 https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#conditional-types梳理出数组属性。
然后我们可以像这样重写你的代码:
const ResArr = flat(vals(ResObj).map(v => flat(vals(v)))).filter(
({ title }) => title.includes(Search)
);
并且没有错误,并且编译器理解ResArr
是一个数组Clothing
对象。
链接到代码 https://typescript-play.js.org/#code/JYOwLgpgTgZghgYwgAgEoQM4HkBGArZAbwChlkBZCEDALiNLOQAk4w6BhAGwHswALUAHMA2gF0A3AzIApRAGsIbZF14CQIiVOQAFOOFrKe-IWMmNkAZT7dMHI2o1nGFgK7AlK4+tMMAvk4A5CAB3O1UTTV9iUEhYRBRPB3oyOEFgTncATzocbm5OCD0fFM4lDDAoIScEfO4oOnLK71Fi5GAAEwaKqoYeBFZgbhAAfi6mwXFkAHop5BhgAA9kYwwGABlufrBBkbGq6dn5pZWGAFtWaGA4Tj31JwAHSqRbjVbH7naLMAuXpww4YAALxeYlaGAE93uQl+DAw+U6yEaPTIGCgCBBLU0ZG2YAKMOx3BhUWIcAwmRACDmLgp2yGyHa3AAggAVBwACgshTRfBeAEpksgatQwGhMMgALzIODBAEimCKBB8NkAAz4YDA91oMxgeQADLqAEwGgB08ygEBwpIgg2NNVOU2NeDhIGVvOqQ3Kouw+Do6G9BAAPshqe0IPMQBB2hKpTL3F7Hc62W6GMAYMg2QBCP3G7hyZABoNZzC4PD8kjmfhQbjBZARmsAUSgVagbIARLpBCgArxkAAxbgh5AAFl1Q9bybIxLIMGpCFpIGQADdrhgADzM5AQBaQEDtDDIbj4CBzgB8bK0cCbdGZDF5dEZTbgmXXm+3VD3yAfUCfq9A8qgyAAKonsgwxAcg17CAomTcGmzKiCB5aMOaYAuFAC4lseYDGsunAuJgbK4RgboHLWECRpuGAGrqACMADsyAZDgcx1MsAirJODAzjSOxzJwrDrmeF5Xp+j7PsyJ63veYmrvW27fnO64ADRSiAmRiCewggC4pw4NAoj5sgckIHhobKap6kIYhWgoWhC6XlApr8WASaTDMZEUZgEbboxwDMTqAEnJxDBCp6fpftGMDOYRK5sn6Ja8sa5z3IREogVFrAxZwGCEbyeWJfMpTQOe5hsoQyzuAUyC+Py4ogTiBTGqAJkuKGOWcpeiq8rekhREAA
好的,希望有帮助;祝你好运!