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 代码。