extends
在 TypeScript 中,extends
是一个关键字,主要用于继承、约束类型或在条件类型中进行类型推断。它有多种用法,具体取决于上下文。
继承类(Class Inheritance)
extends
用于继承类,表示一个类可以继承另一个类的属性和方法。
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound`);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks`);
}
}
const dog = new Dog("Rex", "Labrador");
dog.speak(); // Rex barks
在这个例子中,Dog
类继承了 Animal
类,Dog
可以访问 Animal
的构造函数和方法。
接口继承(Interface Inheritance)
extends
也用于接口,表示一个接口可以继承另一个接口的属性和方法。
interface Animal {
name: string;
speak(): void;
}
interface Dog extends Animal {
breed: string;
}
const dog: Dog = {
name: "Rex",
breed: "Labrador",
speak() {
console.log(`${this.name} barks`);
}
};
这里,Dog
接口继承了 Animal
接口,使得 Dog
接口包含了 Animal
接口的所有属性和方法。
类型约束(Type Constraints)
extends
也可以用在泛型类型中,用于限制泛型类型的约束,即只允许继承自某个类型的类型作为参数。
function identity<T extends number | string>(value: T): T {
return value;
}
identity(42); // 允许
identity("hello"); // 允许
identity(true); // 错误: 类型 'boolean' 不满足约束 'number | string'
在上面的例子中,T extends number | string
表示 T
类型必须是 number
或 string
,如果传入其他类型,则会报错。
条件类型中的 extends
(Conditional Types)
extends
还可以用于条件类型,根据类型是否满足某个条件来决定返回的类型。
type IsString<T> = T extends string ? "Yes" : "No";
type A = IsString<string>; // "Yes"
type B = IsString<number>; // "No"
在这个例子中,IsString
是一个条件类型,判断 T
是否是 string
类型。如果是,返回 "Yes"
;否则返回 "No"
。
联合类型和交叉类型的 extends
extends
还可以用于检查类型之间的关系,特别是在联合类型和交叉类型中。
type A = { a: string };
type B = { a: string; b: number };
type C = A extends B ? "Yes" : "No"; // "No"
type D = B extends A ? "Yes" : "No"; // "Yes"
在这个例子中,A
并不继承自 B
,所以 C
类型是 "No"
。而 B
继承了 A
(因为 B
包含 A
的所有属性),所以 D
类型是 "Yes"
。
映射类型中的 extends
extends
还常用于映射类型中,通过类型推导来修改现有类型。
type MyType<T> = {
[P in keyof T]: T[P] extends string ? string : number;
};
type Example = MyType<{ name: string; age: number }>;
// Example -> { name: string; age: number }
在这个例子中,MyType
是一个映射类型,它根据 T
的属性类型来决定映射后的类型:如果属性类型是 string
,则映射成 string
;否则映射成 number
。