TypeScript 的泛型是其最强大的特性之一,但如何理解这些概念呢?今天,我们要谈论的是在函数、类和接口中如何使用泛型来增加代码的灵活性和复用性。
1. 函数泛型
TypeScript 支持函数泛型,即可以将一个函数的参数类型指定为一组类型,而不是固定的类型。
function identity<T>(arg: T): T { return arg; }
在这个例子中,T 是一个占位符,它代表任何类型。我们可以传入任意类型的值给 identity 函数,然后得到相同类型的结果。
2. 类泛型
TypeScript 也支持类泛型,即可以将一个类的属性和方法指定为一组类型,而不是固定的类型。
class Stack<T> { private elements: T[] = []; push(element: T): void { this.elements.push(element); } pop(): T | undefined { return this.elements.pop(); } }
在这个例子中,T 是一个占位符,它代表任何类型。我们可以创建一个 Stack 类来存储任意类型的元素。
3. 接口泛型
TypeScript 支持接口泛型,即可以将一个接口的属性和方法指定为一组类型,而不是固定的类型。
interface Container<T> { value: T; } class Person implements Container<string> { value: string; constructor(value: string) { this.value = value; } }
在这个例子中,T 是一个占位符,它代表任何类型。我们可以创建一个 Person 类来实现一个 Container 接口,这个接口指定了 value 属性的类型为 string。
4. 泛型约束
TypeScript 支持泛型约束,即可以对泛型类型施加额外的限制。
function identity<T extends string | number>(arg: T): T { return arg; }
在这个例子中,T 是一个占位符,它代表任何类型,但必须是 string 或 number 之一。
5. 泛型继承
TypeScript 支持泛型继承,即可以从父类或父接口中继承泛型类型。
class Animal<T> { name: T; constructor(name: T) { this.name = name; } } class Dog extends Animal<string> { breed: string; constructor(breed: string) { super(breed); } }
在这个例子中,Dog 类从 Animal 类继承泛型类型 T,并指定了它的值为 string。
总之,通过本文,我们应该能够理解 TypeScript 中泛型的各种特性和应用。
来源:
互联网
本文观点不代表源码解析立场,不承担法律责任,文章及观点也不构成任何投资意见。
评论列表