TypeScript 泛型学习指南
[[toc]]
泛型是TypeScript中非常重要的概念,它允许我们创建可重用的组件,这些组件可以支持多种类型而不只是一个单一类型。
1. 基本泛型示例
泛型函数
function identity(arg: number): number { return arg; }
function identityGeneric<T>(arg: T): T { return arg; }
let output1 = identityGeneric<string>("myString"); let output2 = identityGeneric<number>(100);
|
泛型自动类型推断
let output3 = identityGeneric("myString"); let output4 = identityGeneric(100);
|
2. 泛型数组示例
function loggingIdentity<T>(arg: T[]): T[] { console.log(arg.length); return arg; }
function loggingIdentity2<T>(arg: Array<T>): Array<T> { console.log(arg.length); return arg; }
let arr1 = loggingIdentity([1, 2, 3]); let arr2 = loggingIdentity(["a", "b", "c"]);
|
3. 泛型接口
interface GenericIdentityFn<T> { (arg: T): T; }
function identity<T>(arg: T): T { return arg; }
let myIdentity: GenericIdentityFn<number> = identity;
|
4. 泛型类
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; }
let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = (x, y) => x + y;
let stringNumeric = new GenericNumber<string>(); stringNumeric.zeroValue = ""; stringNumeric.add = (x, y) => x + y;
console.log(stringNumeric.add("Hello ", "World"));
|
5. 泛型约束
有时候我们需要限制泛型的类型范围。
interface Lengthwise { length: number; }
function loggingIdentityWithConstraint<T extends Lengthwise>(arg: T): T { console.log(arg.length); return arg; }
loggingIdentityWithConstraint({length: 10, value: 3}); loggingIdentityWithConstraint("hello");
|
6. 在泛型约束中使用类型参数
function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key]; }
let x = { a: 1, b: 2, c: 3, d: 4 };
getProperty(x, "a");
|
7. 泛型与默认类型
interface MyGenericInterface<T = string> { value: T; }
let obj1: MyGenericInterface = { value: "hello" };
let obj2: MyGenericInterface<number> = { value: 123 };
|
8. 实用示例:数据响应包装
interface ApiResponse<T> { success: boolean; data?: T; error?: string; }
function fetchUser(): ApiResponse<{name: string, age: number}> { return { success: true, data: {name: "Alice", age: 30} }; }
function fetchProducts(): ApiResponse<Array<{id: number, name: string, price: number}>> { return { success: true, data: [ {id: 1, name: "Laptop", price: 999}, {id: 2, name: "Phone", price: 699} ] }; }
|
通过这些例子,你应该对TypeScript泛型有了基本的理解。泛型的主要优势是:
- 提高代码复用性
- 提供更好的类型检查
- 减少使用any类型,保持类型安全