[Day05] TS:如何把物件型別的所有屬性值取出變成 union type?試試 Indexed Access Types
昨天我們知道可以使用 keyof
的方式取出物件屬性 key,那麼如果我們是想要取出物件型別中屬性值的型別呢?
例如,有一個物件型別 Person
長這樣:
type Person = {
firsName: string;
lastName: string;
age: number;
isEmployed: boolean;
};
假設我們想要取出 Person 物件型別中 age
的型別時,方式很簡單,可以像 JavaScript 使用 bracket syntax 來取出物件屬性值的方法一樣,像是這樣:
// 建立一個新的名稱為 AgeOfPerson 的型別
// 它的型別會是 Person 物件屬性 "age" 值的型別
type AgeOfPerson = Person['age'];
如此就可以得到它 AgeOfPerson
的型別會是 number
:
而這種透過 Object 的 Index 來取得其型別的方式,就稱作是 Indexed Access Type:
如果想要取得的不只是 age
的屬性值型別,還想同時取出 isEmployed
的屬性型別值的話,同樣的可以搭配使用 union type:
type AgeAndIsEmployedOfPerson = Person['age' | 'isEmployed'];
可以得到 AgeAndIsEmployedOfPerson
的型別就會是 number | boolean
:
要如何取出所有物件型別的屬性值呢?
那麽如果想要取出的是該物件型別中的「所有屬性值的型別」的話可以怎麼做呢?
從上一個段落可以看到,在 []
中以 union type 帶入多個 key 的話,就可以取出不只一個物件屬性值的型別,現在如果想要取得的是所有物件型別的屬性值,是不是只需要把物件型別的所有 key 先組成 union type 後,再代入 []
就可以了呢?
這裡的關鍵字是「把物件型別的所有 key 先組成 union type」。這不就是昨天的內容嗎?
也就是說,使用昨天提到的 keyof Person
,就可以取得所有物件型別的 key,並組成 union type,接著只要把它帶入 []
內:
結果就和我們預期的一樣,ValuesOfPerson
會是 Person
這個物件型別的所有屬性值所組出來的 union type,也就是 string | number | boolean
:
因此,當你未來有需要取得所有物件型別中的屬性值時,記得使用 keyof operator + indexed access types 的組合技。
參考資料
- Indexed Access Types @ TypeScript > Type Manipulation