extends 关键字可以用来对泛型参数进行约束,即限制泛型参数必须是某个类型或其子类型。这样可以确保泛型函数或类在操作时具有更严格的类型安全性。
function getLength<T extends { length: number }>(value: T): number {
return value.length;
}
console.log(getLength("Hello")); // 输出: 5
console.log(getLength([1, 2, 3])); // 输出: 3
解释:
T extends { length: number } 表示泛型参数 T 必须具有 length 属性,且 length 属性的类型为 number。length 属性,所以可以传入函数 getLength。function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const person = { name: "Alice", age: 30 };
console.log(getProperty(person, "name")); // 输出: "Alice"
console.log(getProperty(person, "age")); // 输出: 30
解释:
K extends keyof T 表示 K 必须是类型 T 的属性键,这样可以确保 obj[key] 是有效的操作。在条件类型中,extends 关键字用于判断一个类型是否满足某种条件,并基于此返回不同的类型。
T extends U ? X : Y
T extends U:判断类型 T 是否可以赋值给类型 U。X:如果条件为真,返回类型 X。Y:如果条件为假,返回类型 Y。type IsString<T> = T extends string ? "yes" : "no";
type A = IsString<string>; // "yes"
type B = IsString<number>; // "no"
解释:
IsString<T> 是一个条件类型,如果 T 是 string 类型,则返回 "yes",否则返回 "no"。type ArrayElementType<T> = T extends (infer U)[] ? U : T;
type A = ArrayElementType<string[]>; // string
type B = ArrayElementType<number>; // number
解释:
ArrayElementType<T> 判断 T 是否是数组类型。如果是,则提取数组元素的类型;否则返回 T 本身的类型。extends 关键字在 TypeScript 中非常重要,主要有两种用途:
通过 extends,开发者可以编写出更灵活、健壮且类型安全的 TypeScript 代码。