模式切换
泛型
TypeScript 的泛型(Generics)允许你定义灵活且可复用的组件,这些组件可以支持多种类型。泛型可以看作是一个组件的蓝图,你可以使用不同的类型来实例化这个蓝图。 泛型的主要优势是它们可以增加代码的重用性,类型安全性和灵活性。
泛型函数
一个泛型函数接受一个或多个类型参数。
typescript
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString"); // 返回 "myString"
let output2 = identity<number>(123); // 返回 123
泛型类
你也可以定义泛型类,这样类就可以有多个不同的类型版本。
typescript
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;
console.log(myGenericNumber.add(1, 2)); // 输出 3
泛型接口
你还可以定义泛型接口。
typescript
interface GenericIdentityFn<T> {
(arg: T): T;
}
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn<number> = identity;
泛型约束
有时候你可能想限制泛型参数的类型。例如,你可能只想让你的泛型函数接受那些具有 .length
属性的类型。这时你可以使用泛型约束。
在下面例子中,T 被约束为具有 length 属性的任何类型。因此,你可以传入字符串或任何具有 length 属性的对象。
typescript
function logLength<T extends { length: number }>(arg: T): void {
console.log(arg.length);
}
logLength("hello"); // 输出 5
logLength({length: 10, value: "test"}); // 输出 10