目录
文章目录
- 目录
- 一、泛型程序设计的概念
- 示例:不使用泛型的函数
- 使用泛型
- 二、泛型的使用方式
- 函数声明
- 接口声明
- 类声明
- 约束泛型
- 索引类型和约束类型
- 多类型约束
- 三、应用场景
一、泛型程序设计的概念
泛型程序设计是一种程序设计语言风格或范式,它允许开发者在强类型程序设计语言中编写代码时,使用一些未来才指定的类型。这些类型在实例化时作为参数指明,从而提高了代码的灵活性和可重用性。
在 TypeScript 中,泛型允许我们在定义函数、接口或类时,不预先定义具体的类型,而是在使用时指定类型。这种方式避免了代码的重复,并确保了类型安全。
示例:不使用泛型的函数
以下是一个不接受泛型的函数示例,它只能处理 number
类型的参数:
function returnItem(para: number): number {return para;
}
如果需要处理 string
类型,则需要重写函数:
function returnItem(para: string): string {return para;
}
这种方法导致代码重复,且不够灵活。
使用泛型
使用泛型可以解决这个问题:
function returnItem<T>(para: T): T {return para;
}
泛型使得开发者能够创建灵活且可重用的代码。
二、泛型的使用方式
泛型在 TypeScript 中通过 <>
语法使用,可以应用于函数、接口和类的声明。
函数声明
泛型函数的声明方式如下:
function returnItem<T>(para: T): T {return para;
}
可以定义多个类型参数,例如:
function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // 返回: ['seven', 7]
接口声明
泛型接口的声明方式如下:
interface ReturnItemFn<T> {(para: T): T
}
使用时指定类型:
const returnItem: ReturnItemFn<number> = para => para;
类声明
泛型类可以作用于类本身或类的成员函数:
class Stack<T> {private arr: T[] = [];public push(item: T) {this.arr.push(item);}public pop() {return this.arr.pop();}
}
使用方式:
const stack = new Stack<number>();
约束泛型
可以使用 <T extends xx>
来约束泛型:
class Demo<T extends object> {// 类实现
}
索引类型和约束类型
可以使用索引类型和约束类型来实现更复杂的泛型:
function getValue<T extends object, U extends keyof T>(obj: T, key: U) {return obj[key];
}
多类型约束
可以通过继承多个接口来实现多类型约束:
interface FirstInterface {doSomething(): number;
}
interface SecondInterface {doSomethingElse(): string;
}
interface ChildInterface extends FirstInterface, SecondInterface {}
class Demo<T extends ChildInterface> {private genericProperty: T;constructor(genericProperty: T) {this.genericProperty = genericProperty;}useT() {this.genericProperty.doSomething();this.genericProperty.doSomethingElse();}
}
三、应用场景
在 TypeScript 中,当需要定义函数、接口或类而不预先定义具体类型时,可以使用泛型。灵活地使用泛型定义类型是掌握 TypeScript 的关键。
通过上述介绍,我们可以看到泛型在提高代码复用性、灵活性和类型安全性方面的重要性。在编写 TypeScript 代码时,合理使用泛型将大大提升开发效率和代码质量。