工具型別 - Partial & Pick 
Partial 
傳入一個型別參數,將此型別中的所有屬性變為 optional
原始碼: 
ts
/**
 * Make all properties in T optional
 */
type Partial<T> = {
  [P in keyof T]?: T[P];
};keyof將一個物件的全部屬性提取成 union typein去遍歷每一個 key (union 中的每一項)?轉成 optional typeT[P]索引存取符,從 T 中存取 P 所代表的型別
範例: 
ts
type Person = {
  name: string;
  age: number;
  address: string;
};
type p = Partial<Person>;此時這個 p 的型別就會變成:
ts
type p = {
  name?: string | undefined;
  age?: number | undefined;
  address?: string | undefined;
}Pick 
從一個物件型別的屬性中,選擇一組屬性(字串字面值或字串字面值聯合)並回傳一個新的型別
原始碼: 
ts
/**
 * From T, pick a set of properties whose keys are in the union K
 */
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};- 吃兩個型別參數:T 為一個物件型別,K 為 T 的一個或一組屬性 key 的型別
 - 透過 
extends對泛型 K 做限制,必須為 T 中所包含的屬性 key - 使用 mapped types 來產生對應的型別
 
範例: 
ts
type Person = {
  name: string;
  age: number;
  address: string;
};
type p = Pick<Person, 'age' | 'name'>;此時 p 的型別就會是:
ts
type p = {
  age: number;
  name: string;
}