成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Extract 工具類型八個使用技巧

開發 前端
本文我將介紹 Extract 工具類型的 8 個使用技巧,掌握這些技巧之后,在工作中你就能更好地利用 Extract 工具類型來滿足不同的使用場景。

Extract 是 TypeScript 中內置的工具類型,它用于從聯合類型中提取出符合某個條件的類型,生成一個新的類型。這個工具類型在日常開發中非常有用,它能夠幫助我們編寫類型安全的代碼和更好地實現代碼復用。

/**
 * Extract from T those types that are assignable to U.
 * typescript/lib/lib.es5.d.ts
 */
type Extract<T, U> = T extends U ? T : never;

type T0 = Extract<"a" | "b" | "c", "a" | "f">
// type T0 = "a"

本文我將介紹 Extract 工具類型的 8 個使用技巧,掌握這些技巧之后,在工作中你就能更好地利用 Extract

1.提取指定的基本數據類型

type MyTypes = string | number | boolean;
type StringOrNumber = Extract<MyTypes, string | number>;

let uid: StringOrNumber = "semlinker" // Ok
uid = 2024 // Ok
uid = false // Error
// Type 'boolean' is not assignable to type 'StringOrNumber'.

2.提取指定的字符串字面量類型

type Color = 'red' | 'green' | 'blue' | 'yellow';
type PrimaryColors = Extract<Color, 'red' | 'green' | 'blue'>;

const primaryColor: PrimaryColors = 'blue'; // Ok
const secondaryColor: PrimaryColors = 'yellow'; // Error
// Type '"yellow"' is not assignable to type 'PrimaryColors'.

3.提取可調用的函數類型

type Value = string | number | (() => void);
type CallableFn = Extract<Value, Function>;

const fn1: CallableFn = () => console.log('semlinker'); // Ok
const fn2: CallableFn = 'semlinker'; // Error
// Type 'string' is not assignable to type '() => void'.

4.提取兩個聯合類型的共有成員

type TaskStatus = "Todo" | "InProgress" | "Done" | "Archived";
type ModuleHandledStatus = "Todo" | "Done" | "OnHold";

type ModuleSpecificStatus = Extract<TaskStatus, ModuleHandledStatus>;
// type ModuleSpecificStatus = "Todo" | "Done"

5.提取含有特定屬性的子類型

Animal 聯合類型,包含了多種動物的描述對象,我們想從中提取出含有 "legs" 屬性的子類型。

type Animal =
    | { type: 'dog', legs: number }
    | { type: 'cat', legs: number }
    | { type: 'fish', fins: number };

type AnimalsWithLegs = Extract<Animal, { legs: number }>;

const dog: AnimalsWithLegs = { type: 'dog', legs: 4 }; // Ok
const cat: AnimalsWithLegs = { type: 'cat', legs: 4 }; // Ok
const fish: AnimalsWithLegs = { type: 'fish', fins: 6 }; // Error
// Type '"fish"' is not assignable to type '"dog" | "cat"'.

6.提取特定的事件類型

type EventTypes = MouseEvent | KeyboardEvent | TouchEvent;

type OnlyMouseEvents = Extract<EventTypes, MouseEvent>;

function handleMouseEvent(event: OnlyMouseEvents) {
    console.log('Handling mouse event:', event.clientX, event.clientY);
}

document.addEventListener('click', (event) => {
    handleMouseEvent(event); // OK
});

document.addEventListener('keydown', (event) => {
    handleMouseEvent(event); // Error
    // Argument of type 'KeyboardEvent' is not assignable to parameter of type 'MouseEvent'.
});

7.在類型守衛中使用 Extract

使用 Extract 可以在類型守衛中精確地過濾類型,使得在條件分支中可以安全地使用過濾后的類型。

type Pet = { type: 'dog', bark: () => void } | { type: 'cat', meow: () => void };

function isDog(pet: Pet): pet is Extract<Pet, { type: 'dog' }> {
    return pet.type === 'dog';
}

const pet1: Pet = { type: 'dog', bark: () => console.log('Woof!') }
const pet2: Pet = { type: "cat", meow: () => console.log("Meow!") }
console.log(`pet1 is dog: ${isDog(pet1)}`) // "pet1 is dog: true" 
console.log(`pet2 is dog: ${isDog(pet2)}`) // "pet2 is dog: false"

8.在函數重載中使用 Extract

在處理 API 請求的場景中,我們需要根據不同的請求類型(如 GET、POST、DELETE)處理不同類型的數據。為了增強類型安全和確保每種請求類型都正確地處理其數據,我們可以利用 TypeScript 的函數重載和 Extract 工具類型。

type RequestType = 'GET' | 'POST' | 'DELETE';
type RequestData = {
    GET: undefined;
    POST: { body: string };
    DELETE: { resourceId: number };
};

// Function overloading, based on the request type, accepts matching data types
function sendRequest<T extends RequestType>(type: 'GET', data: Extract<RequestData[T], undefined>): void;
function sendRequest<T extends RequestType>(type: 'POST', data: Extract<RequestData[T], { body: string }>): void;
function sendRequest<T extends RequestType>(type: 'DELETE', data: Extract<RequestData[T], { resourceId: number }>): void;
function sendRequest<T extends RequestType>(type: T, data: RequestData[T]): void {
    console.log(`Sending ${type} request with data:`, data);
}

sendRequest('GET', undefined); // Ok
sendRequest('POST', { body: "semlinker" }); // Ok
sendRequest('DELETE', { resourceId: 2024 }); // Ok

sendRequest('POST', { body: 2024 }); // Error
// Type 'number' is not assignable to type 'string'.
sendRequest('DELETE', undefined); // Error
// Argument of type 'undefined' is not assignable to parameter of type '{ resourceId: number; }'.
責任編輯:姜華 來源: 全棧修仙之路
相關推薦

2024-04-01 07:51:49

Exclude?工具類型TypeScript

2022-05-30 00:04:16

開源Github技巧

2012-10-29 11:01:17

2025-01-02 15:08:36

SpringBoot自動配置Java

2010-08-25 11:14:05

云安全數據安全網絡安全

2011-09-25 10:46:18

云計算安全

2010-09-09 13:44:06

DIVCSS

2025-02-07 15:01:49

Promise數組前端

2010-08-11 16:43:05

職場

2023-10-24 09:25:23

IT技巧文化

2023-11-29 10:16:45

內網開源

2022-12-15 16:38:17

2023-10-10 10:27:37

DevOps

2023-09-26 12:04:15

重構技巧Pythonic

2024-01-02 16:16:34

Promise前端

2025-05-09 09:26:12

2023-01-11 11:35:40

重構PythonPythonic

2020-07-21 08:14:13

TypeScrip

2023-06-02 08:00:00

ChatGPT人工智能

2024-01-11 18:04:53

SQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精 | 人妖av| 精品久久久久久红码专区 | 国产日韩电影 | 国产一区二区在线免费播放 | 青青久在线视频 | 91福利在线观看视频 | 国产精品夜色一区二区三区 | 精品成人免费视频 | 久久综合狠狠综合久久综合88 | 久草视频在线播放 | 国产在线网址 | 国产免费一区二区 | 午夜小视频免费观看 | 99热99| 国产一二区视频 | 亚洲性视频 | 亚洲高清一区二区三区 | 国产成人高清视频 | 九九久久精品视频 | 91福利电影在线观看 | 中文字幕第十五页 | 欧美日韩视频在线 | 亚洲视频在线观看 | 亚洲免费精品 | 国产免费视频在线 | 奇米影视在线 | 国产视频91在线 | 色吧色综合 | hsck成人网 | 国产精品久久7777777 | 日韩网站在线 | 天天看天天爽 | 在线观看免费毛片 | 亚洲精品日韩一区二区电影 | 久久99久久98精品免观看软件 | 男人的天堂一级片 | 日韩蜜桃视频 | 亚洲成人中文字幕 | 中文字幕在线视频一区二区三区 | 91在线看|