我想遍歷 js 中的物件陣列以查找具有特定鍵的元素。
值得注意的是,“特定密鑰”將僅存在于其中一個物件中,不再存在。(也有可能任何物件中都不存在“鍵”)
例如:
const arr: [
{ foo: number; fooo: number },
{ bar: number; barr: number },
{ baz: number; bazz: number }
] = [
{ foo: 100, fooo: 1 },
{ bar: 3, barr: 200 },
{ baz: 0, bazz: 0 },
];
我正在使用下面的代碼來查找具有所需密鑰的物件:
const wantedObj = arr.find((el) => (typeof el.baz !== 'undefined'))
由于 可能key具有虛假值(例如: 0 ),因此我正在檢查(typeof el.baz !== 'undefined')條件。
但我得到了 TS 錯誤
Property 'bazz' does not exist on type '{ foo: number; fooo: number; } | { bar: number; barr: number; } | { baz: number; bazz: number; }'.
Property 'bazz' does not exist on type '{ foo: number; fooo: number; }'.ts(2339)
為什么 TS 給出了這個錯誤,而我已經明確定義了 的型別arr?以及如何解決?
uj5u.com熱心網友回復:
并非其中的每個物件arr都有baz屬性。這就是為什么el里面的型別find看起來像這樣:
{
foo: number;
fooo: number;
} | {
bar: number;
barr: number;
} | {
baz: number;
bazz: number;
}
每當您擁有不同物件型別的聯合時,您只能使用點符號訪問共享屬性。
我們必須el在訪問之前縮小 first的型別baz。in運算子讓我們檢查物件的任何屬性。甚至那些未在其型別中定義的。in運算子還允許我們將聯合范圍縮小到存在屬性的那些元素。
const wantedObj = arr.find((el) =>
"baz" in el && typeof el.baz !== "undefined"
);
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531058.html
上一篇:在不使用getElementById的情況下獲取iframesrc
下一篇:檢查陣列中的單個連續字符
