標題 | 詳情 |
---|---|
作者簡介 | 愚公搬代碼 |
頭銜 | 華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。 |
近期榮譽 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年華為云十佳博主,2023年華為云十佳博主,2024年華為云十佳博主等。 |
博客內容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鴻蒙、Linux、物聯網、網絡安全、大數據、人工智能、U3D游戲、小程序等相關領域知識。 |
歡迎 | 👍點贊、?評論、?收藏 |
文章目錄
- 🚀前言
- 🚀一、TypeScript 中的泛型
- 🔎1.泛型基礎概念
- 🔎2.泛型使用場景
- 🔎3.泛型變量與約束
- 🔎4.泛型函數定義方式
- 🔎5.泛型與集合
- 🔎6.泛型接口
- 🔎7.泛型類
- 🔎8.多類型參數
- 🔎9.關鍵注意事項
🚀前言
在現代開發中,泛型是一種重要的編程概念,能夠極大地提升代碼的靈活性和可重用性。TypeScript作為一種強大的編程語言,提供了對泛型的良好支持,讓開發者能夠以更安全和高效的方式處理各種數據類型。在鴻蒙原生應用開發中,掌握TypeScript中的泛型,不僅能優化代碼結構,還能提升應用的性能和可維護性。
在本篇文章中,我們將詳細介紹TypeScript中的泛型,包括泛型函數、泛型接口和泛型類等核心概念。通過豐富的實例,我們將展示如何在鴻蒙原生應用中靈活運用泛型,幫助你實現更高效的開發流程,減少代碼冗余,提升項目的可讀性和可擴展性。
🚀一、TypeScript 中的泛型
🔎1.泛型基礎概念
定義:泛型(Generics)允許在定義函數、接口或類時不預先指定具體類型,而是在使用時動態指定類型,提升代碼復用性和類型安全。
function identity<T>(arg: T): T {return arg;
}
🔎2.泛型使用場景
- 兼容多類型需求
避免為不同類型重復編寫相同邏輯的函數:// 非泛型:需為不同類型單獨實現 function f(a: number): number[] { return [a]; } function f2(a: string): string[] { return [a]; }// 泛型:統一處理多種類型 function f3<T>(a: T): T[] { return [a]; } f3<number>(1); // 顯式指定類型 f3('hello'); // 類型推斷自動推導為 string
🔎3.泛型變量與約束
-
類型變量
T
表示任意類型,但需確保對T
的操作合法:function getLength<T>(arg: T): number {return arg.length; // 錯誤:T 可能沒有 length 屬性 }
-
泛型約束(
extends
)
限制T
必須滿足特定結構:interface HasLength {length: number; } function getLengthSafe<T extends HasLength>(arg: T): number {return arg.length; // 正確:T 必須包含 length 屬性 } getLengthSafe('abc'); // 3 getLengthSafe(123); // 錯誤:number 無 length
🔎4.泛型函數定義方式
-
函數聲明
function myFunc<T>(x: T): T { return x; }
-
函數表達式
const myFunc = function<T>(x: T): T { return x; };
-
箭頭函數
const myFunc = <T>(x: T): T => x; // 注意:在 JSX 中需寫成 <T, > 避免語法沖突
🔎5.泛型與集合
-
數組泛型
明確數組元素類型:let arr: Array<number> = [1, 2, 3];
-
動態生成數組
function createArray<T>(len: number, value: T): T[] {return Array(len).fill(value); } createArray<string>(3, 'x'); // ['x', 'x', 'x']
🔎6.泛型接口
-
泛型參數在接口方法中
interface GenericInterface {<T>(arg: T): T; } const func: GenericInterface = (arg) => arg;
-
泛型參數在接口名中
interface GenericInterface<T> {(arg: T): T; } const func: GenericInterface<string> = (arg) => arg;
🔎7.泛型類
在類定義時聲明泛型,供實例屬性和方法使用:
class GenericClass<T> {value: T;constructor(val: T) {this.value = val;}getValue(): T {return this.value;}
}
const numInstance = new GenericClass<number>(10);
🔎8.多類型參數
支持同時定義多個泛型類型:
function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]];
}
swap<number, string>([1, 'one']); // ['one', 1]
🔎9.關鍵注意事項
- 避免濫用
any
泛型在保留類型信息的同時提供靈活性,優于any
。 - 類型推斷優先級
多數情況下無需顯式指定類型參數,編譯器可自動推斷。 - 約束與靈活性平衡
通過extends
確保類型安全,但過度約束可能限制泛型適用性。