在TypeScript(以及其他支持泛型的编程语言)中,泛型(Generics)是一种允许你定义可重用的组件的工具。这些组件可以用各种类型工作,而不仅仅是一个单一的类型。
泛型提供了一种灵活和可重用的方式来创建函数、接口和类,而不会牺牲类型安全。
泛型函数
这是一个不使用泛型的函数,它接受一个number
数组,并返回一个number
数组:
function identity(arr: number[]): number[] {
return arr;
}
使用泛型,你可以这样写:
function identity<T>(arr: T[]): T[] {
return arr;
}
泛型接口
泛型不仅可以应用于函数,还可以应用于接口。例如:
interface GenericIdentityFn<T> {
(arg: T): T;
}
泛型类
泛型还可以用于定义类。例如:
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
多个泛型参数
你还可以定义接受多个泛型参数的函数、接口或类:
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
泛型约束
你还可以使用泛型约束,以限制泛型类型的使用范围:
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
在这个例子中,泛型T
必须遵守Lengthwise
接口的结构。
泛型与其他类型的结合
泛型可以和联合类型、交叉类型、类型别名等一起使用,提供更高级的类型抽象和操作。
例如:
type Container<T> = T | null;
或者:
type Tree<T> = {
value: T;
left: Tree<T>;
right: Tree<T>;
}
总的来说,泛型提供了一种强大而灵活的方式,用于将可重用的组件连接到类型上,同时又不牺牲类型信息。