TypeScript 工具类型一次讲透:Pick、Omit、Partial、Record 逐个击破
TypeScript å·¥å ·ç±»å䏿¬¡è®²éï¼PickãOmitãPartialãRecord é个å»ç ´
黿¬å³° 2026-08-19 10 é 读12åé"æ¥å£åæ®µè¦æå 个ãå å 个ãå ¨é¨æ¹å¯éâ¦â¦æä¸å¼å§å ¨æ¯æåæ° interfaceï¼ç´¯å°æç人çãç´å°å¦ä¼äºè¿å ä¸ªå·¥å ·ç±»åï¼åæ¥ TS æ©å°±ææ´»ç»ä½ åå¤å¥½äºã"
åè¨
åå¦ TypeScript é£ä¼å¿ï¼ææä¸ª User æ¥å£å°å¤ç¨ï¼å表页è¦å±ç¤º id + nameï¼ç¼è¾é¡µè¦æäº¤ id + name + ageï¼èç»å½åè¿åçæ¥å£æ°æ®åä¸è½æ email æ´é²ç»å端ã
äºæ¯æå¾èå®å°åäºä¸å个é¿å¾å ä¹ä¸æ ·ç interfaceï¼å段å å ååï¼æ¹ä¸ä¸ªå°æ¹è¦åæ¥æ¹ä¸å ã
忥æç¥éï¼è¿äº"ä»å·²æçç±»åéæææ£æ£ãçæä¸ä¸ªæ°ç±»å"çæä½ï¼TS 宿¹æ©å°±å ç½®äºä¸å¥å·¥å ·ç±»åï¼Utility Typesï¼ï¼ä¸å¥è¯å°±è½æå®ãè¿ç¯æç« æææè¸©è¿çååæç»ææçæè·¯æ´çåºæ¥ï¼æ¯ä¸ªç±»åé½é å¯è¿è¡ä»£ç + 大ç½è¯ + 对æ¯è¡¨ã
ä½ å°ä¼æ¶è·ï¼
- ð¯ ææ 8 个é«é¢å·¥å
·ç±»åï¼
PickãOmitãPartialãExcludeãkeyofãReturnTypeãRecord - ð å½»åºçè§£é£å¥ç»å£ç
Omit<T, K>çä»·äºPick<T, Exclude<keyof T, K>> - ð§ æ¯ä¸ªç±»åé 宿´å¯è¿è¡ä»£ç ï¼ç²è´´å³ç¨
- ð HTTP ç¶æç 宿 + é¢è¯éæ¥è¡¨ + å£è¯ï¼èåæ«ä¸ç¼å°±å¤
ææ¯æ ï¼TypeScriptã
ð é 读æç¤ºï¼å ¨æå´ç»ä¸ä¸ª
Useræ¥å£å±å¼ï¼å è®°ä½è¿ä¸ª"主è§"ï¼å颿¯ä¸ªç±»å齿¯å¯¹å®çæ¹é ã
ç®å½
- ä¸ãå·¥å ·ç±»åå°åºè§£å³ä»ä¹é®é¢ï¼
- äºãkeyofï¼æ¿å°ææé®çèåç±»åï¼å°åºï¼
- ä¸ãPickï¼ä»ç±»åéæå段
- åãOmitï¼ä»ç±»åéå åæ®µ
- äºãæ ¸å¿ï¼Omit å ¶å®çäº Pick + Exclude
- å ãPartialï¼ææå段åæå¯é
- ä¸ãRecordï¼é®å¼å¯¹çåå ¸æ å°
- å «ãReturnTypeï¼æ¿å°å½æ°è¿åå¼ç±»å
- ä¹ãExcludeï¼èåç±»åçå·®é
- åãç»æéæ¥è¡¨ + é¢è¯é«é¢ N é®
ä¸ãå·¥å ·ç±»åå°åºè§£å³ä»ä¹é®é¢ï¼
å ç¨å¤§ç½è¯è®²æ¸ æ¥çç¹ï¼åè®²å®æ¯ä»ä¹ã
å设æä»¬æä¸ä¸ªç¨æ·æ¥å£ï¼
interface User {
id: number;
name: string;
age: number;
email: string;
}
ç°å¨æä¸ªéæ±ï¼å表页åªéè¦ id å nameï¼å
¶ä»å段é½ä¸æ³è¦ã
"ç¬¨åæ³"æ¯éæ°åä¸ä¸ª interfaceï¼
// â ç¬¨åæ³ï¼æåä¸ä¸ªç²¾ç®çï¼å段å User æ¯å¤å¶ç²è´´çå
³ç³»
interface UserPreview {
id: number;
name: string;
}
åæ®µä¸å¤ãæ¥å£ä¸åï¼ä½ å°±å¾äººè忥好å ä»½ï¼æ¹æ¼ä¸ä¸ªå°±åº bugã
å·¥å ·ç±»åè¦è§£å³çï¼å°±æ¯è¿ä¸ª"ä»å·²æç±»åæ´¾çæ°ç±»å"çæ´»å¿ï¼
// â
ä¸å¥è¯ï¼ä» User éæåº id å nameï¼çææ°ç±»å
type UserPreview = Pick<User, 'id' | 'name'>;
大ç½è¯è§£é
| æ¦å¿µ | ä¸å¥äººè¯ | ç±»æ¯ | |
|---|---|---|---|
| å·¥å ·ç±»å | æ¿æ¥ä¸ä¸ªæ§ç±»åï¼å å·¥åºä¸ä¸ªæ°ç±»å | ä¸ä¸ª"ç±»åå å·¥å" | |
| `Pick<User, 'id' | 'name'>` | ä» User éæåº idãname ä¸¤ä¸ªåæ®µ | èåç¹èï¼å¾éå 个è |
ð¡ æ ¸å¿ææ³ï¼å·¥å ·ç±»åä¸ä¼å空é ç±»åï¼å®ä¸å®æ¯åºäºä¸ä¸ªå·²æç±»åå忢ãè¿ä¸ª"å·²æç±»å"å°±æ¯ä¸æåå¤åºç°ç
Userã
ä¸é¢æ"å°åº â æ£åæ â ååå â åç â å ¶ä»å 个"ç顺åºï¼é个å»ç ´ã
äºãkeyofï¼æ¿å°ææé®çèåç±»åï¼å°åºï¼
å¦å
¶ä»å·¥å
·ç±»åä¹åï¼å¿
é¡»å
ææ keyofââ宿¯å颿æäººçå°åºã
大ç½è¯
keyof T ä¼æç±»å T çææé®åæ½åºæ¥ï¼æ¼æä¸ä¸ªèåç±»åï¼| è¿æ¥çå符串ï¼ã
interface User {
id: number;
name: string;
age: number;
email: string;
}
type UserKeys = keyof User;
// UserKeys = 'id' | 'name' | 'age' | 'email'
keyof User ç¿»è¯æäººè¯å°±æ¯ï¼"User èº«ä¸ææå段åçéå"ã
ç±»æ¯
keyof åä¸ä»½åå·¥è±ååââå®ä¸å
³å¿æ¯ä¸ªå段ç弿¯ä»ä¹ç±»åï¼åªæ"åå"ååºæ¥ã
| æ¦å¿µ | è¾åº | ç±»æ¯ |
|---|---|---|
keyof User | 'id' | 'name' | 'age' | 'email' | è±ååä¸çå忏 å |
ð¡ ä¸å¥è¯è®°ä½ï¼
keyof T= æ¿å° T çææé®ï¼æ¼æä¸ä¸ª|èåç±»åãåé¢PickãOmitãExcludeå ¨é å®ã
ä¸ãPickï¼ä»ç±»åéæå段
Pick<T, K> ä»ç±»å T éæåº K æå®çé£äºå段ï¼ç»ææ°ç±»åãK å°±æ¯è¦æçé®çèåå符串ã
大ç½è¯
Pick = ç¹èãèåå°±æ¯ Userï¼ä½ å¾éåªå ä¸ªåæ®µï¼æåç«¯ä¸æ¡çå°±åªæé£å æ ·ã
interface User {
id: number;
name: string;
age: number;
email: string;
}
// ä» User éæåº id å nameï¼å½¢æä¸ä¸ª"ç²¾ç®çç¨æ·"ç±»å
type UserPreview = Pick<User, 'id' | 'name'>;
const u: UserPreview = {
id: 1,
name: 'æ¬å³°',
};
// â
åªæ idãname ä¸¤ä¸ªåæ®µï¼åå¤äºæ¥éï¼åå°äºä¹æ¥é
éè¡è®²è§£
| 代ç | å«ä¹ |
|---|---|
Pick<User, 'id' | 'name'> | ä» User éæ idãname ä¸¤ä¸ªåæ®µ |
type UserPreview = ... | ç»æ°ç±»å起个åå |
const u: UserPreview = {...} | åé u åªè½æ idãname |
为ä»ä¹éè¦å®ï¼ââ 夿项ç®ç"åºå度"
ð¯ 宿æä¹ï¼å¤§å项ç®éç±»åæ¶è´¹ç¹å«å¤ââåä¸ä¸ª
Userï¼å表页ã详æ 页ãç¼è¾é¡µãæ¥å£è¿ååèªéè¦çåæ®µé½ä¸ä¸æ ·ãç¨Pickå°±è½æåºæ¯æ´¾çåºç²¾ç¡®çç±»åï¼è¯¥æ´é²å ä¸ªåæ®µå°±æ´é²å 个ï¼ç±»åè¾¹çæ¸ æ°ï¼å«äººä¸çUserPreviewå°±ç¥éè¿æ¯"åªç»ç id å name çè½»éç"ã
åãOmitï¼ä»ç±»åéå åæ®µ
Omit<T, K> å Pick æ£å¥½ç¸åï¼ä»ç±»å T éå æ K æå®çåæ®µï¼çä¸å
¶ä½çå
¨é¨ã
大ç½è¯
Omit = æé»ãä½ è¯´"ä¸è¦ email"ï¼å©ä¸çå ¨ç»ä½ ã
interface User {
id: number;
name: string;
age: number;
email: string;
}
// 廿 email åæ®µï¼å©ä¸ç idãnameãage ç»ææ°ç±»å
type UserSafe = Omit<User, 'email'>;
const safeUser: UserSafe = {
id: 1,
name: 'æ¬å³°',
age: 20,
};
// â
没æ email åæ®µäºï¼éå"ä¸è½æé®ç®±æ´é²ç»å端"çåºæ¯
Pick vs Omit æä¹éï¼
| åºæ¯ | ç¨åªä¸ª | ä¾å |
|---|---|---|
| è¦çåæ®µå°ï¼æå°æ°å ä¸ªï¼ | Pick | å表页åªè¦ idãname |
| ä¸è¦çåæ®µå°ï¼å å°æ°å ä¸ªï¼ | Omit | åªä¸æ³è¦ email |
ð¡ ç»éªï¼è¦ççå¤å°±
Omitï¼è¦ççå°å°±Pickï¼åªä¸ªåèµ·æ¥å段å°ç¨åªä¸ªã
äºãæ ¸å¿ï¼Omit å ¶å®çäº Pick + Exclude
è¿æ¯å ¨æçéç¹ï¼ä¹æ¯é¢è¯æç±è¿½é®çä¸å¥ç»å£ä»¤ï¼
Omit<T, K>çä»·äºPick<T, Exclude<keyof T, K>>
æç¬¬ä¸æ¬¡çå°è¿å¥è¯çæ¶åæ¯æµçï¼æå¼ä¸æ¥æ¥èµ°å°±éäºï¼
å䏿¥èµ°
ç¬¬ä¸æ¥ï¼keyof T æ¿å°ææé®çèåç±»å
type UserKeys = keyof User;
// 'id' | 'name' | 'age' | 'email'
ç¬¬äºæ¥ï¼Exclude æè¦åé¤ç K é®å æï¼å©ä¸éè¦ä¿ççé®
type KeepKeys = Exclude<UserKeys, 'email'>;
// 'id' | 'name' | 'age' ââ email 被ä»èåç±»åéå æäº
ç¬¬ä¸æ¥ï¼åç¨ Pick æå©ä¸çé®ä»ç±»å T éæåºæ¥ï¼å°±å®ç°äº Omit çææ
type MyOmitUser = Pick<User, KeepKeys>;
// çä»·äº Omit<User, 'email'>
ä¸å¼ å¾çææ°æ®æµ
keyof User Exclude<..., 'email'> Pick<User, å©ä¸çé®>
ââââââââââââââââ å æ email ââââââââââââââââ æåºæ¥ ââââââââââââââââââ
â id name â ââââââââââââââ â id name â ââââââââââ â åªå« id name age â
â age email â â age â â ç User æ°ç±»å â
ââââââââââââââââ ââââââââââââââââ ââââââââââââââââââ
â æ¿é® â¡ åé¤ â¢ æé
TS å é¨ Omit ççä»·å®ç°
TypeScript æºç éï¼Omit å°±æ¯è¿ä¹å®ä¹çï¼lib.d.ts éè½æ¾å°ï¼ï¼
// Omit ç宿¹å®ç°ï¼å
æ K ä» keyof T éæé¤ï¼åç¨ Pick æåæ¥
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
ä¹å°±æ¯è¯´ï¼Omit 并䏿¯ä¸ä¸ª"åç"è½åï¼èæ¯ Pick + Exclude è¿ä¸¤ä¸ªæ´åºå±è½åçç»åââå®å°±æ¯ä¸å±è¯æ³ç³ï¼å¾çäºèå·²ã
â ï¸ é¢è¯èç¹ï¼"Omit çåºå±åçæ¯ä»ä¹ï¼" ââ çï¼
Omit<T, K>çäºPick<T, Exclude<keyof T, K>>ï¼å keyofæ¿é® âExcludeåé¤ K âPickæå©ä½ï¼æ¬è´¨æ¯PickåExcludeçç»åè¯æ³ç³ã
å ãPartialï¼ææå段åæå¯é
Partial<T> æç±»å T çææåæ®µå
¨é¨åæå¯éï¼æ¯ä¸ªå段åèªå¨å ?ï¼ã
大ç½è¯
Partial = æå¿ çç填空é¢ï¼å ¨é¨æ¹æéåé¢ââä½ å¯ä»¥ä¸ä¸ªé½ä¸å¡«ã
interface User {
id: number;
name: string;
age: number;
email: string;
}
// ææå段é½åæå¯éäº
type PartialUser = Partial<User>;
// patch ä¿®æ¹åºæ¯ï¼å¯¹è±¡å±æ§å¾å¤ï¼åªæ³æ¹å
¶ä¸ä¸ä¸¤ä¸ª
const patchUser: PartialUser = {
id: 1,
name: 'æ¬å³°',
age: 20,
};
// çè³å¯ä»¥ä¼ ç©ºå¯¹è±¡ï¼ææå段é½å¯éï¼
const emptyObj: PartialUser = {};
宿æä¹ï¼patch æ´æ°
ð¯ å ¸ååºæ¯ï¼åä¸ä¸ª"ä¿®æ¹ç¨æ·ä¿¡æ¯"çæ¥å£ï¼å端å¯è½åªæ¹é®ç®±ãåªæ¹å¹´é¾ï¼ä¹å¯è½å ¨æ¹ãç¨
Partial<User>å½åæ°ç±»åï¼å°±å 许åªä¼ é¨ååæ®µï¼ä¸ç¨æ¯æ¹ä¸ä¸ªåæ®µå°±éæ°åä¸ä¸ªæ¥å£ã
// åªæ¹é®ç®±ï¼å
¶ä»å段é½ä¸ç¨ä¼
function updateUser(id: number, patch: Partial<User>) {
// ... æ patch éæçåæ®µæ´æ°å°æ°æ®åº
}
updateUser(1, { email: 'new@example.com' }); // â
åªä¼ email
对æ¯
| åæ³ | åæ®µæ¯å¦å¿ å¡« | åºæ¯ |
|---|---|---|
User | å ¨é¨å¿ å¡« | å建æ°ç¨æ· |
Partial<User> | å ¨é¨å¯é | é¨åæ´æ°ï¼patchï¼ |
ä¸ãRecordï¼é®å¼å¯¹çåå ¸æ å°
Record<K, V> å¿«é声æä¸ä¸ª"é®å¼å¯¹"ç±»åï¼é®çç±»åæ¯ Kï¼å¼çç±»åæ¯ Vã
大ç½è¯
Record = çµè¯ç°¿ / åå
¸ãRecord<é®ç±»å, å¼ç±»å> å°±æ¯"ææ key æ¯æç±»åãææ value æ¯æç±»å"çä¸å¼ 表ã
// ä¸ä¸ªåç¬¦ä¸²å°æ°åçåå
¸ï¼key æ¯ stringï¼value æ¯ number
type Dict = Record<string, number>;
const obj: Dict = { a: 1, b: 2 };
// â
鮿¯å符串ï¼å¼æ¯æ°å
// æ°åå°åç¬¦ä¸²çæ å°ï¼key æ¯ numberï¼value æ¯ string
type ErrorMsgMap = Record<number, string>;
宿ï¼HTTP ç¶æç â é误æç¤º
è¿æ¯ Record æç»å
¸çç¨æ³ï¼æç¶æç æ å°æä¸å¥äººè¯ï¼
type ErrorMsgMap = Record<number, string>;
// HTTP ç¶æç çè¯ä¹ï¼
// 1xx æ§è¡ä¸ / 2xx æå / 3xx è¦è·³è½¬ / 4xx ç¨æ·é误 / 5xx æå¡ç«¯é误
const errorMessage: ErrorMsgMap = {
400: '请æ±åæ°é误',
401: 'æªç»å½ï¼è¯·éæ°ç»å½',
403: 'æéä¸è¶³ï¼ç¦æ¢è®¿é®',
404: 'èµæºæ¾ä¸å°',
500: 'æå¡å¨å
é¨é误',
};
function getErrMsg(code: number) {
// ?? æ¯ç©ºå¼åå¹¶ï¼æ¥å¾å°å°±è¿åå¯¹åºææ¡ï¼æ¥ä¸å°å
åº"æªç¥é误"
return errorMessage[code] ?? 'æªç¥é误';
}
getErrMsg(404); // 'èµæºæ¾ä¸å°'
getErrMsg(999); // 'æªç¥é误'
对æ¯
| åæ³ | å«ä¹ | ç±»æ¯ |
|---|---|---|
Record<string, number> | key æ¯ stringï¼value æ¯ number | é讯å½ï¼åå â çµè¯ |
Record<number, string> | key æ¯ numberï¼value æ¯ string | ç¶æç â éè¯¯ææ¡ |
ð¡ ä¸å¥è¯è®°ä½ï¼
Record<K, V>å°±æ¯"é®ç±»å + å¼ç±»å"ï¼é®å¼å¯¹åå ¸ä¸ç¨ã
å «ãReturnTypeï¼æ¿å°å½æ°è¿åå¼ç±»å
ReturnType<T> æ¿å°ä¸ä¸ªå½æ°çè¿åç±»åãæ³¨æä¼ çæ¯ typeof 彿°åï¼ä¸æ¯å½æ°æ¬èº«ã
大ç½è¯
ReturnType = è®©å½æ°"èªå·±äº¤ä»£"å®è¿åäºä»ä¹ï¼ä¸ç¨ä½ 人èå»çã
function fn() {
return { x: 1, y: 2 };
}
// æ¿å° fn çè¿åç±»å = { x: number, y: number }
type FnReturn = ReturnType<typeof fn>;
// FnReturn ç°å¨å°±æ¯ä¸ªæ®é对象类åï¼å¯ä»¥è¿æ ·ç¨
const result: FnReturn = { x: 10, y: 20 }; // â
为ä»ä¹ä¼ typeof fnï¼
ReturnType è¦çæ¯å½æ°çç±»åï¼è fn æ¯å½æ°çå¼ï¼æä»¥è¦ç¨ typeof fn æ"å¼"转æ"ç±»å"ãè¿æ¯ä¸ªå°åï¼å¾å¤äººç¬¬ä¸æ¬¡åæ¼ typeof ç´æ¥æ¥éï¼
// â é误ï¼ReturnType<fn> ââ fn æ¯å¼ä¸æ¯ç±»åï¼æ¥é
// type Wrong = ReturnType<fn>;
// â
æ£ç¡®ï¼ç¨ typeof æ¿å°å½æ°çç±»å
type Right = ReturnType<typeof fn>;
ð¡ ä¸å¥è¯è®°ä½ï¼
ReturnType<typeof fn>ï¼typeofåä¸å«æ¼ã
ä¹ãExcludeï¼èåç±»åçå·®é
Exclude<T, U> ä»èåç±»å T éå餿 U éåºç°çæåã
大ç½è¯
Exclude = ä»ååéåæå ä¸ªäººãæ³¨æå®å¤ççæ¯èåç±»åï¼ä¸æ¯å¯¹è±¡ã
type All = 'id' | 'name' | 'age' | 'email';
type After = Exclude<All, 'email'>;
// After = 'id' | 'name' | 'age' ââ email 被åæäº
Exclude å Omit å«ææ··ï¼é«é¢èç¹ï¼
â ï¸ é¢è¯èç¹ï¼
ExcludeåOmit齿¯"åé¤"ï¼ä½ä½ç¨å¯¹è±¡å®å ¨ä¸åã
| 维度 | Exclude | Omit |
|---|---|---|
| ä½ç¨å¯¹è±¡ | èåç±»åï¼'a' | 'b' | 'c'ï¼ | 对象æ¥å£ï¼interfaceï¼ |
| åé¤ä»ä¹ | èåç±»åéçæä¸ªæå | 对象éçæä¸ªå段 |
| ä¾å | Exclude<'a'|'b'|'c', 'b'> | Omit<User, 'email'> |
| ç±»æ¯ | ååéåæåå | å æå¯¹è±¡çä¸ä¸ªå±æ§ |
ð¡ ä¸å¥è¯è®°ä½ï¼
Excludeå¤çèåç±»åï¼Omitå¤ç对象æ¥å£ãäºè ä¸ä¸ªå "æå"ï¼ä¸ä¸ªå "åæ®µ"ã
åãç»æéæ¥è¡¨ + é¢è¯é«é¢ N é®
å·¥å ·ç±»åéæ¥è¡¨
| å·¥å ·ç±»å | è¯æ³ | ä½ç¨ | ä¸å¥è¯ |
|---|---|---|---|
keyof | keyof T | æ¿ææé®çèåç±»å | è±åå |
Pick | Pick<T, K> | æåº K æå®çåæ®µ | ç¹è |
Omit | Omit<T, K> | å æ K æå®çåæ®µ | æé» |
Partial | Partial<T> | ææå段åå¯é | éåé¢ |
Record | Record<K, V> | é®å¼å¯¹åå ¸ | çµè¯ç°¿ |
ReturnType | ReturnType<typeof fn> | æ¿å½æ°è¿åç±»å | 让å®èªå·±äº¤ä»£ |
Exclude | Exclude<T, U> | èåç±»åå·®é | ååååå |
åºå±å®ç°éæ¥
è¿äºå·¥å ·ç±»åå ¶å®é½æ¯ TS 宿¹"æ¼"åºæ¥çï¼çæå®ä»¬è½å¸®ä½ çè§£æ´ä¸ªç±»åç³»ç»ï¼
| å·¥å ·ç±»å | åºå±å®ç° |
|---|---|
Pick<T, K> | { [P in K]: T[P] } |
Omit<T, K> | Pick<T, Exclude<keyof T, K>> |
Partial<T> | { [P in keyof T]?: T[P] } |
Exclude<T, U> | T extends U ? never : T |
Record<K, V> | { [P in K]: V } |
ð éé¢ç
[P in K]æ¯æ å°ç±»åè¯æ³ï¼å±äºæ´è¿é¶çä¸åï¼æå ´è¶£å¯ä»¥å æè¿å¼ 表åçï¼åé¢åç¬å¼ä¸ç¯è®²ã
é¢è¯é«é¢ N é®
1. Omit å Exclude æä»ä¹åºå«ï¼Omit ä½ç¨äºå¯¹è±¡æ¥å£ï¼å é¤çæ¯å段ï¼Exclude ä½ç¨äºèåç±»åï¼å é¤çæ¯æåãOmit<User, 'email'> å æ User ç email åæ®µï¼Exclude<'a'|'b'|'c', 'b'> ä»èåç±»åéåæ 'b'ã
Omit<T, K> çä»·äº Pick<T, Exclude<keyof T, K>>ï¼å
keyof æ¿é® â Exclude åé¤ K â Pick æå©ä½ã宿¯ Pick + Exclude çç»åè¯æ³ç³ã
æææåæ®µåå¯éï¼å¸¸ç¨äº"é¨åæ´æ°ï¼patchï¼"åºæ¯ââå 许åªä¼ éè¦ä¿®æ¹çåæ®µï¼è䏿¯å¿ é¡»ä¼ å ¨éã
4. ReturnType 为ä»ä¹è¦å typeofï¼ReturnType éè¦çæ¯å½æ°çç±»åï¼è彿°åæ¯å¼ï¼typeof fn æå¼è½¬æç±»ååæè½ä¼ è¿å»ã
é®å¼å¯¹åå ¸æ å°ï¼æå ¸åçæ¯ HTTP ç¶æç â éè¯¯ææ¡ãé 置项æ å°ç"ç¨ä¸ä¸ª key æ¥ä¸ä¸ª value"çåºæ¯ã
æ»ç»
ä¸å¥è¯ä¸²èµ·å ¨æï¼
keyofæ¿é®ï¼Pickæå段ï¼Omitå åæ®µï¼Partialåå¯éï¼Recordååå ¸ï¼ReturnTypeåè¿åï¼Excludeå èåæåââèOmitæ¬è´¨å°±æ¯Pick+Excludeçè¯æ³ç³ã
æ ¸å¿ä»£ç 骨æ¶ï¼5 è¡è®°ä½å ¨é¨ï¼ï¼
interface User { id: number; name: string; age: number; email: string; }
type A = Pick<User, 'id' | 'name'>; // æå段
type B = Omit<User, 'email'>; // å åæ®µ = Pick + Exclude
type C = Partial<User>; // å
¨å¯é
type D = Record<number, string>; // åå
¸
type E = Exclude<keyof User, 'email'>; // èåç±»åå·®é
ç»å°¾
è¿å¥å·¥å ·ç±»ååæ¥è§¦å¯è½è§å¾"ä¸å¦æåæ¥å¾ç´æ¥"ï¼ä½ä¸æ¦é¡¹ç®éç±»åå¤èµ·æ¥ï¼ä½ å°±ç¥éå®ä»¬è½çå¤å°å¤å¶ç²è´´ã叿è¿ç¯æç« å¸®ä½ æè¿ 8 个类å䏿¬¡ææ¸ æ¥ã
æºç å¨ hjf-ai/interview/ts/pick_partial/ ç®å½ä¸ãæé®é¢æ¬¢è¿å¨è¯è®ºåºäº¤æµï¼å¦æè§å¾æç¨ï¼æ±ä¸ªç¹èµæ¶è ð¥
åäº 2026 å¹´ 8 æ · TypeScript é¢è¯å¤æ
Aitishiku.com