泛型约束:用于限制泛型类型参数的范围
🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
文章目录
- 泛型约束的基本概念
- 示例
- 约束为特定接口
- 约束为特定类
- 使用多个约束
- 泛型约束的优势
泛型约束(Generic Constraints)用于限制泛型类型参数的范围,以确保它们满足特定的条件。通过泛型约束,可以在编译时捕获更多的类型错误,提高代码的安全性和可维护性。
泛型约束的基本概念
泛型约束通过在类型参数后面添加 extends
关键字来实现。可以约束类型参数必须实现某个接口、继承某个类或满足某个条件。
示例
约束为特定接口
interface HasLength {
length: number;
}function getLength<T extends HasLength>(arg: T): number {
return arg.length;
}let result = getLength("Hello, world!"); // 输出: 13
在这个例子中,getLength
函数的类型参数 T
被约束为必须实现 HasLength
接口,因此可以安全地访问 length
属性。
约束为特定类
class Animal {
constructor(public name: string) {}
}class Dog extends Animal {
bark() {
console.log(`${this.name} is barking.`);
}
}function makeAnimalSpeak<T extends Animal>(animal: T): void {
console.log(`${animal.name} makes a sound.`);
}let dog = new Dog("Buddy");
makeAnimalSpeak(dog); // 输出: Buddy makes a sound.
在这个例子中,makeAnimalSpeak
函数的类型参数 T
被约束为必须继承自 Animal
类,因此可以安全地访问 name
属性。
使用多个约束
interface HasName {
name: string;
}interface HasAge {
age: number;
}function printPersonInfo<T extends HasName & HasAge>(person: T): void {
console.log(`Name: ${person.name}, Age: ${person.age}`);
}let person = { name: "Alice", age: 30 };
printPersonInfo(person); // 输出: Name: Alice, Age: 30
在这个例子中,printPersonInfo
函数的类型参数 T
被约束为必须同时实现 HasName
和 HasAge
接口。
泛型约束的优势
- 类型安全:通过泛型约束,可以在编译时捕获更多的类型错误,确保代码的安全性。
- 代码可读性:泛型约束使代码更加清晰,明确类型参数的要求。
- 灵活性:泛型约束提供了更高的灵活性,可以在不同的上下文中使用相同的泛型函数或类。
通过合理使用泛型约束,可以编写出更加安全、可维护且灵活的代码。