泛型(Generics)是一种编程语言特性,它允许你在定义函数、接口或类时使用类型参数,从而实现代码的复用和类型安全。在 TypeScript 中,泛型提供了一种强大的方式来创建可重用的组件,这些组件可以与多种类型一起工作,而不是单一类型。
类型参数:在定义泛型时,你可以使用类型参数来表示一个或多个类型。这些类型参数在使用时会被具体的类型替换。
泛型函数:允许函数接受不同类型的参数,并返回相应的类型。
泛型接口:允许接口定义时使用类型参数,使得接口可以适用于多种类型。
泛型类:允许类在实例化时指定类型参数,使得类的属性和方法可以处理不同的类型。
TypeScript 中的泛型主要有以下几种使用方式:
<T>
来表示类型参数。<T>
来表示类型参数。<T>
来表示类型参数。function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString");
let output2 = identity("myString"); // 类型推断
interface GenericIdentityFn<T> {
(arg: T): T;
}
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn<number> = identity;
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
constructor(zeroValue: T, add: (x: T, y: T) => T) {
this.zeroValue = zeroValue;
this.add = add;
}
}
let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);
在 TypeScript 中,你可以使用泛型来创建一个接受类型作为键的对象:
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"); // okay
getProperty(x, "m"); // error: Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'.
在这个例子中,K extends keyof T
确保了 key
是 T
类型的有效键。
问题:在使用泛型时,可能会遇到类型推断不准确的问题。
原因:TypeScript 编译器有时无法准确推断出泛型的具体类型,尤其是在复杂的类型操作中。
解决方法:
let result = identity<string>("Hello");
let value = someFunction() as SomeType;
通过这些方法,你可以更好地利用 TypeScript 的泛型特性,编写出既灵活又类型安全的代码。
领取专属 10元无门槛券
手把手带您无忧上云