TypeScript中的實用工具類型(Utility Types)

来源:https://www.cnblogs.com/sparkler/archive/2023/04/22/17343820.html
-Advertisement-
Play Games

為什麼要使用Composition API? 根據官方的說法,vue3.0的變化包括性能上的改進、更小的 bundle 體積、對 TypeScript 更好的支持、用於處理大規模用例的全新 API,全新的api指的就是本文主要要說的組合式api。 在 vue3 版本之前,我們復用組件(或者提取和重用 ...


TypeScript中的實用工具類型是一些預定義的泛型類型,可用於操作或創建其它新類型。這些實用工具類型在所有TypeScript項目中都是全局可用的,因此無需添加任務依賴項即可使用它們。

1.Partial<Type>

將Type的所有屬性都設置為可選的類型。

 1 interface Person {
 2   name: string;
 3    age: number;
 4   email: string;
 5 }
 6 
 7  type PartialPerson = Partial<Person>;
 8 
 9  //相當於
10  // interface Person {
11  //   name?: string | undefined;
12  //   age?: number | undefined;
13  //   email?: string | undefined;
14  // }
15 
16 interface Todo {
17    title: string;
18    description: string;
19 }
20 
21 function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
22    return { ...todo, ...fieldsToUpdate };
23 }
24 
25 const todo1 = {
26   title: "organize desk",
27   description: "clear clutter",
28 };
29 
30 const todo2 = updateTodo(todo1, {
31    description: "throw out trash",
32 });

2.Required<Type>

與Partical<Type> 相反,該類型由Type中所有屬性設置為required組成。

 1 interface Person {
 2  name?: string | undefined;
 3  age?: number | undefined;
 4  email?: string | undefined;
 5 }
 6 
 7 
 8 type RequiredPerson = Required<Person>;
 9 
10 // 相當於
11 // interface Person {
12 //   name: string;
13 //   age: number;
14 //   email: string;
15 // }

3.Omit<Type, Keys>

構建一個新類型--從類型 Type 中獲取所有屬性,然後從中剔除 Keys 屬性。

 1 interface User {
 2   id: number;
 3   name: string;
 4   email: string;
 5   age: number;
 6 }
 7 
 8 type UserWithoutEmail = Omit<User, 'email'>;
 9 
10 // 相當於
11 // interface Person {
12 //   id: string;
13 //   name: string;
14 //   age: number;
15 // }

也可以移除多個屬性,

 1 interface User {
 2   id: number;
 3   name: string;
 4   email: string;
 5   age: number;
 6 }
 7 
 8 type UserWithoutEmailAndName = Omit<User, 'email' | 'name'>;
 9 
10 // 相當於 
11 // interface Person {
12 //   id: string;
13 //   age: number;
14 // }

4.Pick<Type, Keys>

從類型 Type 中挑選部分屬性 Keys 來構造類型,與Omit相反。

 1 interface User {
 2   id: number;
 3   name: string;
 4   email: string;
 5   age: number;
 6 }
 7 
 8 type UserWithEmailAndName = Pick<User, 'email' | 'name'>;
 9 
10 // 相當於
11 // interface Person {
12 //   name: string;
13 //   email: string;
14 // }

可以組合使用這些類型,創造新的類型

 1 interface User {
 2   id: number;
 3   name: string;
 4   email: string;
 5   age: number;
 6 }
 7 
 8 type PartialPick = Partial<Pick<User, 'email' | 'name'>>;
 9 
10 // 相當於
11 // interface Person {
12 //   name?: string | undefined;
13 //   email?: string | undefined;
14 // }
 1 interface User {
 2   id: number;
 3   name: string;
 4   email: string;
 5   age: number;
 6 }
 7 
 8 type OmitPartialPick = Omit<Partial<Pick<User, 'email' | 'name'>>, 'email'>;
 9 
10 // 相當於 
11 // interface Person {
12 //   name?: string | undefined;
13 // }

5.Readonly<Type>

通過該Type構造新類型,並將它所有的屬性設置為只讀的,也就意味著構造出的類型的屬性不能被再次賦值。

 1 interface Person {
 2   id: number;
 3   name: string;
 4   age: number;
 5 }
 6 
 7 type ReadonlyPerson = Readonly<Person>;
 8 
 9 //相當於
10 // interface Person {
11 //   readonly id: number;
12 //   readonly name: string;
13 //   readonly age: number;
14 // }
15 
16 const person: ReadonlyPerson = {
17   id: 1,
18   name: 'John',
19   age: 25
20 };
21 
22 person.name = 'Mike'; // Error: Cannot assign to 'name' because it is a read-only property.

這個類型可用來表示在運行時會失敗的賦值表達式(比如,當嘗試給凍結對象的屬性再次賦值時)

Object.freeze

1 function freeze<T>(obj: T): Readonly<T>;

6.Record<Keys, Type>

構造一個對象類型,其屬性為Keys,屬性值為Type;該實用工具類型可用於將一種類型的屬性映射到另一種類型。

 1 interface CatInfo {
 2   age: number;
 3   breed: string;
 4 }
 5  
 6 type CatName = "miffy" | "boris" | "mordred";
 7  
 8 const cats: Record<CatName, CatInfo> = {
 9   miffy: { age: 10, breed: "Persian" },
10   boris: { age: 5, breed: "Maine Coon" },
11   mordred: { age: 16, breed: "British Shorthair" },
12 };
13  
14 cats.boris;
15  

7.Exclude<UnionType, ExcludedMembers>

通過從 UnionType 中排除所有可分配給 ExcludedMembers 的屬性來構造一個類型;也就是刪除 union 類型的成員來創建新類型。

1 type T0 = Exclude<"a" | "b" | "c", "a">;
2 type T0 = "b" | "c"
3 
4 type T1 = Exclude<"a" | "b" | "c", "a" | "b">;
5 type T1 = "c"
6 
7 type T2 = Exclude<string | number | (() => void), Function>;
8 type T2 = string | number

8.Extract<Type, Union>

通過從 Type 中提取可分配給 Union 的所有聯合成員來構造一個類型,與 Exclude 相反。

1 type T0 = Extract<"a" | "b" | "c", "a" | "f">;
2 type T0 = "a"
3 
4 type T1 = Extract<string | number | (() => void), Function>;
5 type T1 = () => void

9.NonNullable<Type>

通過從 Type 中排除 null 和 undefined 來構造一個類型。

1 type T0 = NonNullable<string | number | undefined>;
2 type T0 = string | number
3 
4 type T1 = NonNullable<string[] | null | undefined>;
5 type T1 = string[]

10.ReturnType<Type>

由函數類型 Type 的返回值類型構建一個新類型。

 1 function add(a: number, b: number): number {
 2   return a + b;
 3 }
 4 
 5 type AddReturnType = ReturnType<typeof add>;
 6 // type AddReturnType = number;
 7 
 8 
 9 function addStr(a: string, b: string): string{
10   return a + b;
11 }
12 
13 type AddReturnType2 = ReturnType<typeof addStr>;
14 // type AddReturnType2 = string;
15 
16 type T0 = ReturnType<() => string>;
17 type T0 = string
18 
19 type T1 = ReturnType<(s: string) => void>;
20 type T1 = void
21 
22 type T2 = ReturnType<<T>() => T>;    
23 type T2 = unknown
24 
25 type T3 = ReturnType<<T extends U, U extends number[]>() => T>;
26 type T3 = number[]

11.Parameters<Type>

由函數類型 Type 的參數類型來構建出一個元組類型。

 1 function add(a: number, b: string, c:boolean): string {
 2   return a + b;
 3 }
 4 
 5 type AddReturnType = Parameters<typeof add>;
 6 // type AddReturnType = [a: number, b: string, c:boolean];
 7 
 8 type T0 = Parameters<() => string>;
 9 type T0 = []
10 
11 type T1 = Parameters<(s: string) => void>;
12 type T1 = [s: string]
13 
14 type T2 = Parameters<<T>(arg: T) => T>;
15 type T2 = [arg: unknown]

12.Awaited<Type>

這種類型旨在模擬非同步函數中的 await 或 Promises 上的 .then() 方法等操作——具體來說,就是它們遞歸展開 Promises 的方式。

 1 async function fetchData(): Promise<string> {
 2   // fetch data from API and return a string
 3 }
 4 
 5 type ResolvedResult = Awaited<ReturnType<typeof fetchData>>;
 6 // type ResolvedResult = string
 7 
 8 type A = Awaited<Promise<string>>;
 9 type A = string
10  
11 type B = Awaited<Promise<Promise<number>>>; 
12 type B = number
13  
14 type C = Awaited<boolean | Promise<number>>;  
15 type C = number | boolean

以上,是較常用的一些實用工具類型。

參考資料:

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

https://dev.to/arafat4693/typescript-utility-types-that-you-must-know-4m6k

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。 假如我們在ASP.NET Core MVC ...
  • Windows 10總是替我們想得很周到,各種各樣的安全設置,雲里霧裡感覺老安全了。可是,為什麼我自己的電腦,許可權反而不是自己的?!刪除個文件還要許可權?別管那麼多,把我的電腦還給我! 一分鐘奪回Windows系統許可權 對“此電腦”右鍵選擇“管理”進入管理設置: 在“系統工具”的下拉菜單中找到“本地用 ...
  • 下載CentOS6.5系統源 http://mirror.nsc.liu.se/centos-store/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso 下載CentOS6.5系統的yum組件 http://mirror.nsc.liu.se/cento ...
  • Linux核心命令系列文章目錄 快速上手Linux核心命令(一):核心命令簡介 快速上手Linux核心命令(二):關機、重啟 快速上手Linux核心命令(三):文件和目錄操作命令 快速上手Linux核心命令(四):文件內容相關命令 快速上手Linux核心命令(五):文本處理三劍客 快速上手Linux ...
  • 平臺 windows 需 求 由於我近期有一個比賽,而我的主機又是x86架構的,人家要求使用arm架構的主機,我這窮屌絲,不可 能去買一臺吧,而且隨著國產系統的推進,採用arm架構的主機也越來越多,作為運維我們該怎麼利用x86 來運行arm架構的主機成為了一個問題 需 要的軟體和程式 以下軟體版本皆 ...
  • 1.硬體 GD32F103C8T6最小系統板 ST-LINK V2下載器 2.GPIO說明 每個通用I/O埠都可以通過兩個32位的控制寄存器(GPIOx_CTL0/ GPIOx_CTL1)和兩個32位 的數據寄存器(GPIOx_ISTAT, GPIOx_OCTL)配置為8種模式:模擬輸入,浮空輸入 ...
  • 首先,我準備了兩台linux,一臺準備當作master,ip是192.168.241.128,另一臺是當作slave,ip是192.168.241.129。 1. 安裝redis docker pull redis 2. 下載對應版本的redis.conf 可以從github上下載。新建配置環境目錄 ...
  • 錄音需求中,往往有兩種常規操作。 長按基本實現流程: 監聽觸摸事件,按下時錄製,抬起時停止。 點擊基本流程: 點擊開始錄製,在次點擊停止錄製 但是凡事有絕對,如果需要同時支持長按錄製抬起結束跟點擊錄製在次點擊結束呢?面對如此無理的需求,從技術層面上怎麼如絲滑般去相容呢。 需要兩者相容,只能從觸摸事件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...