0%

TypeScript 第幾招 - Pick<Type, Keys>

寫法

Pick<Type, Keys>

由一個 Type 所擁有的屬性中,選取幾個屬性建構出一個新的 type。
舉個例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type IDMapping = {
STUDENT: {
school: string;
name: string;
grade: string;
},
ENGINEER: {
company: string;
position: string;
salary: string
}
}

type CHILD: Pick<IDMapping, 'STUDENT'>;

const person: CHILD = {
STUDENT: {
school: 'abc university',
name: 'John',
grade: 'freshman',
}
}

console.log(person.STUDENT.school);

上面的例子,可以看到我們製作出一張總列表 IDMapping,裡面包含所有,我們之後會用到的型別的定義。
假設今天我們想要做出一個學生身分的型別,我們就可以利用 Pick 只抓出 IDMapping 裡面有關學生的
類別定義的部分。

專案實際作用

Pick 這個方法真的蠻好用的。
在專案中,我們可能有好幾種含有不同 head 項目的 table,所以,我們就可以將專案中會用到的 table 的
head 的項目,定義在一張總 type 裡面。
等到某一種 table 需要使用總 type 裡的某一種 table 的類別的時候,就可以利用 Pick 把他抓出來定義。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type tableMapping = {
USER_LIST: {
staffId: string;
firstName: string;
lastName: string;
mail: string;
}
USER_HISTORY: {
updatedTimestamp: string;
editor: string;
role: string
}
TRANSACTION_LIST: {
dealTimestamp: string;
price: string
transaction_way: string
}
}

type user_info: Pick<tableMapping, 'USER_LIST'|'USER_HISTORY'>
const staff: user_info = {
USER_LIST: {
staffId: '1254';
firstName: 'Jay';
lastName: 'Lin';
mail: 'xxx@hotmail.com';
},
USER_HISTORY: {
updatedTimestamp: '1680016023';
editor: 'Jay Lin';
role: 'manager'
}
}

console.log(staff.USER_LIST.staffId, staff.USER_HISTORY.editor);

以上範例的寫法,就可以讓專案的某一個區域裡,同時擁有 USER_LIST 和 USER_HISTORY 這兩個類別合在一起的資料囉。

Reference

  1. https://www.typescriptlang.org/docs/handbook/utility-types.html