網站搜尋

typescript - 如何對篩選 Object.entries 進行型別保護?


我希望有像 entryof 這樣的東西來對條目進行類型保護,如下所示:

const carDude = {
  name: "Tom",
  age: 45,
  car: "Porsche 911"
}

interface Dude {
  name: string;
  age: number;
}

Object
  .entries(carDude)
  .filter((entry): entry is entryof Dude => 
    entry[0] === "name" || entry[0] === "age"
  )

如何使用類型守衛來解決這個問題?

答案#1

我傾向於這樣定義 EntryOf:

type EntryOf<T extends object> = { [K in keyof T]: [K, T[K]] }[keyof T];

這將接受一個物件類型 T 並將其轉換為條目元組的聯集。然後你的程式碼可以寫成

const ret = Object.entries(carDude).filter((entry): entry is EntryOf<Dude> =>
    entry[0] === "name" || entry[0] === "age"
);
/* const ret: (["name", string] | ["age", number])[] */

你會看到返回的陣列類型其元素類型為 ["name", string] | ["age", number],就像我假設你想要的那樣。

希望那有幫助;祝你好運!

程式碼的 Playground 連結