函数中的泛型应用场景
- 复用代码:当函数逻辑相同,但处理的数据类型不同时,可使用泛型。例如,一个简单的返回输入值的函数,不局限于特定类型。
function identity<T>(arg: T): T {
return arg;
}
let result1 = identity<number>(5);
let result2 = identity<string>("hello");
- 类型安全:TypeScript 编译器能根据传入的类型参数,确保函数内部对该参数的操作符合其类型。如上述
identity
函数,编译器知道 result1
是 number
类型,result2
是 string
类型,在后续使用中会进行类型检查。
类中的泛型应用场景
- 复用代码:比如创建一个简单的栈数据结构,它可以存储不同类型的数据。
class Stack<T> {
private items: T[] = [];
push(item: T) {
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
}
let numberStack = new Stack<number>();
numberStack.push(10);
let poppedNumber = numberStack.pop();
let stringStack = new Stack<string>();
stringStack.push("world");
let poppedString = stringStack.pop();
- 类型安全:编译器能保证在
Stack
类中,对 items
数组的操作类型正确。如 numberStack
只能操作 number
类型数据,stringStack
只能操作 string
类型数据。
接口中的泛型应用场景
- 复用代码:定义一个通用的响应接口,根据不同的业务场景,响应数据类型不同。
interface Response<T> {
data: T;
status: number;
}
let userResponse: Response<{ name: string, age: number }> = {
data: { name: "John", age: 30 },
status: 200
};
let productResponse: Response<{ title: string, price: number }> = {
data: { title: "Book", price: 10 },
status: 200
};
- 类型安全:确保
Response
接口实例中的 data
属性类型与定义的泛型类型一致。如 userResponse
的 data
必须是 { name: string, age: number }
类型,productResponse
的 data
必须是 { title: string, price: number }
类型。