TypeScript泛型工作原理詳解
什么是泛型?
TypeScript 中的泛型允許編寫可處理各種數(shù)據(jù)類型的代碼,同時保持類型安全。它們允許在不犧牲類型檢查的情況下創(chuàng)建可重用的組件、函數(shù)和數(shù)據(jù)結(jié)構(gòu)。
泛型由類型參數(shù)表示,這些參數(shù)充當(dāng)類型的占位符。這些參數(shù)在尖括號 ( <> ) 中指定,可以在整個代碼中用于定義變量類型、函數(shù)參數(shù)、返回類型等。
TypeScript 泛型用例
泛型的基本用法
讓我們從泛型函數(shù)的簡單示例開始:
function identity<T>(arg: T): T {
return arg;
}
const output = identity<string>("hello");
console.log(output); // hello
在此示例中, identity 是一個采用類型參數(shù)的泛型函數(shù) T 。參數(shù) arg 的類型為 T ,函數(shù)的返回類型也是 T 。調(diào)用 identity<string>("hello") 時,類型參數(shù) T 推斷為 string ,確保類型安全。
如何使用泛型類
泛型不僅限于函數(shù),它們還可以與類一起使用。請考慮以下泛型 Box 類示例:
class Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
const box = new Box<number>(42);
console.log(box.getValue()); // 42
這里, Box 是一個帶有類型參數(shù)的泛型類 T 。構(gòu)造函數(shù)采用 type 的值,該 getValue 方法返回 type T T 的值。創(chuàng)建 的實例時 Box ,它只能存儲和返回 類型的 number 值。
如何對泛型應(yīng)用約束
有時,您可能希望限制可用于泛型的類型。TypeScript 允許您使用 extends 關(guān)鍵字指定對類型參數(shù)的約束。讓我們看一個例子
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
const result = loggingIdentity("hello");
console.log(result); // Output: hello
在此示例中,該 loggingIdentity 函數(shù)采用一個類型參數(shù), T 該參數(shù)必須擴(kuò)展 Lengthwise 接口,從而確保具有 arg length 屬性。此約束允許在不導(dǎo)致編譯錯誤的情況下訪問 length 該屬性。
如何將泛型與接口一起使用
泛型還可以與接口一起使用,以創(chuàng)建靈活且可重用的定義。請看以下示例:
interface Pair<T, U> {
first: T;
second: U;
}
let pair: Pair<number, string> = { first: 1, second: "two" };
console.log(pair); // Output: { first: 1, second: "two" }
這里, Pair 是一個具有兩個類型參數(shù) T 和 的接口,分別表示 first 和 second U 屬性的類型。聲明 pair 為 Pair<number, string> 時,它強(qiáng)制要求屬性必須是數(shù)字,并且 first second 屬性必須是字符串。
如何將泛型函數(shù)與數(shù)組一起使用
function reverse<T>(array: T[]): T[] {
return array.reverse();
}
let numbers: number[] = [1, 2, 3, 4, 5];
let reversedNumbers: number[] = reverse(numbers);
console.log(reversedNumbers); // Output: [5, 4, 3, 2, 1]
在此示例中,該 reverse 函數(shù)采用 type T 的數(shù)組,并返回相同類型的反向數(shù)組。通過使用泛型,該函數(shù)可以處理任何類型的數(shù)組,從而確保類型安全。
如何將泛型約束與 keyof
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
let person = { name: "John", age: 30, city: "New York" };
let age: number = getProperty(person, "age");
console.log(age); // Output: 30
在這里,該 getProperty 函數(shù)接受一個 type 的對象和一個 type T K 的鍵,其中 K 擴(kuò)展了 T 的鍵。然后,它從對象返回相應(yīng)的屬性值。此示例演示如何在訪問對象屬性時使用泛型 keyof 來強(qiáng)制實施類型安全性。
如何使用泛型實用程序函數(shù)
function toArray<T>(value: T): T[] {
return [value];
}
let numberArray: number[] = toArray(42);
console.log(numberArray); // Output: [42]
let stringArray: string[] = toArray("hello");
console.log(stringArray); // Output: ["hello"]
該函數(shù)將類型的 T 單個值轉(zhuǎn)換為包含該 toArray 值的數(shù)組。這個簡單的實用函數(shù)展示了如何使用泛型來創(chuàng)建可重用的代碼,這些代碼可以毫不費力地適應(yīng)不同的數(shù)據(jù)類型。
如何將泛型接口與函數(shù)一起使用
interface Transformer<T, U> {
(input: T): U;
}
function uppercase(input: string): string {
return input.toUpperCase();
}
let transform: Transformer<string, string> = uppercase;
console.log(transform("hello")); // Output: HELLO
在此示例中,我們定義了一個 Transformer 接口,其中包含兩個類型參數(shù) T 和 U ,分別表示輸入和輸出類型。然后,我們聲明一個函數(shù) uppercase 并將其分配給 類型的 Transformer<string, string> 變量 transform 。這演示了如何使用泛型來定義函數(shù)的靈活接口。
總結(jié)
無論是函數(shù)、類還是接口,泛型都為構(gòu)建可伸縮和可維護(hù)的 TypeScript 應(yīng)用程序提供了可靠的機(jī)制。理解和掌握泛型可以顯著提高您編寫高效且無錯誤的代碼的能力。
以上就是TypeScript泛型工作原理詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript泛型的資料請關(guān)注腳本之家其它相關(guān)文章!
- TypeScript?泛型接口具體使用實戰(zhàn)
- TypeScript之Generics泛型類型學(xué)習(xí)
- TypeScript中泛型的使用詳細(xì)講解
- TypeScript接口與泛型全面精講
- TypeScript泛型使用詳細(xì)介紹
- TypeScript泛型的使用詳細(xì)介紹
- TypeScript?泛型推斷實現(xiàn)示例詳解
- TypeScript?泛型重載函數(shù)的使用方式
- 在?TypeScript?中使用泛型的方法
- TypeScript泛型約束條件示例詳解
- typeScript?泛型使用和泛型接口結(jié)合
- TypeScript 泛型四大應(yīng)用場景與高級用法
相關(guān)文章
JavaScript使ifram跨域相互訪問及與PHP通信的實例
這篇文章主要介紹了JavaScript使ifram跨域相互訪問及與PHP通信的實例,同時對同域間的訪問也作了詳細(xì)的演示,需要的朋友可以參考下2016-03-03
在layui中l(wèi)ayer彈出層點擊事件無效的解決方法
今天小編就為大家分享一篇在layui中l(wèi)ayer彈出層點擊事件無效的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript實現(xiàn)仿Clock ISO時鐘
這篇文章給大家分享了JavaScript實現(xiàn)仿Clock ISO時鐘的方法以及實例代碼,有興趣的朋友參考學(xué)習(xí)下下。2018-06-06

