简述TypeScript 中的泛型是什么,如何使用 ?
在TypeScript中,泛型是一种工具,允许你在定义函数、接口、类时不预先指定具体的类型,而是在使用时指定类型。泛型提供了一种方法来确保函数或类的灵活性和重用性,同时保持类型的完整性和安全性。
什么是泛型?
泛型允许你创建可以适用于多种类型而不是单一类型的组件。通过使用泛型,你可以创建通用的函数、接口和类,它们可以安全地工作于多种类型而不丢失类型信息。
如何使用泛型?
泛型函数
你可以创建一个接受类型参数的函数,然后在函数体内部使用这个类型参数。这样,函数就可以根据传入的类型参数变化其行为。
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("myString"); // 类型为 string
let output2 = identity<number>(100); // 类型为 number
在这个例子中,identity
函数添加了一个类型变量T
。T
帮助你捕获用户提供的类型(比如string
或number
),之后就可以使用这个类型。通过<string>
和<number>
,我们明确了T
分别代表string
和number
类型。
泛型接口
泛型也可以用于接口。泛型接口可以让你定义带有不特定类型的属性或方法的接口。
interface GenericIdentityFn<T> {
(arg: T): T;
}
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn<number> = identity;
这个例子中的GenericIdentityFn
是一个泛型接口,它定义了一个函数,该函数接收一个类型为T
的参数并返回一个类型为T
的值。
泛型类
泛型也可以用于类的定义。但是,泛型类只能影响类的实例部分,因为类的静态属性不能使用类的泛型类型参数。
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
在这个例子中,GenericNumber
类使用了泛型类型T
。然后我们创建了一个GenericNumber<number>
的实例,明确指定T
为number
类型。
为什么使用泛型?
泛型的主要优点是它们提高了代码的复用性、保持了类型安全,并使得代码更加灵活。使用泛型可以让你创建工作于多种类型的组件,而不是限定于某一类型,同时在编译时保持严格的类型检查。这样,你可以捕获更多的错误,并编写更通用、更健壮的代码。