TypeScript 的关键字 extends 有什么作用?

2024-08-26 15:25:53 586
TypeScript 的 `extends` 关键字 主要有两个作用:类型约束和条件类型。它在不同的上下文中使用时,功能有所不同。

1. 类型约束 (Type Constraints)

extends 关键字可以用来对泛型参数进行约束,即限制泛型参数必须是某个类型或其子类型。这样可以确保泛型函数或类在操作时具有更严格的类型安全性。

示例 1: 类型约束的基本用法

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

示例 2: 类型约束确保类型安全

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] 是有效的操作。
  • 这个函数可以安全地获取对象的属性值,并且返回正确的类型。

2. 条件类型 (Conditional Types)

在条件类型中,extends 关键字用于判断一个类型是否满足某种条件,并基于此返回不同的类型。

条件类型的基本语法

T extends U ? X : Y
  • T extends U:判断类型 T 是否可以赋值给类型 U
  • X:如果条件为真,返回类型 X
  • Y:如果条件为假,返回类型 Y

示例 3: 条件类型的基本用法

type IsString<T> = T extends string ? "yes" : "no";

type A = IsString<string>;  // "yes"
type B = IsString<number>;  // "no"

解释:

  • IsString<T> 是一个条件类型,如果 Tstring 类型,则返回 "yes",否则返回 "no"

示例 4: 结合泛型和条件类型

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 中非常重要,主要有两种用途:

  1. 类型约束:用于限制泛型参数必须符合某个类型,从而增强类型安全性。
  2. 条件类型:用于在类型层面进行条件判断,使得类型系统更加灵活和强大。

通过 extends,开发者可以编写出更灵活、健壮且类型安全的 TypeScript 代码。