推荐答案
function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key]; } let x = { a: 1, b: 2, c: 3, d: 4 }; getProperty(x, "a"); // 正确 getProperty(x, "m"); // 错误:Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'.
本题详细解读
泛型约束的概念
泛型约束(Generic Constraints)是指在定义泛型时,通过 extends
关键字对泛型参数的类型进行限制,确保泛型参数必须满足某些条件。这样可以增强代码的类型安全性,避免在运行时出现类型错误。
使用 extends
关键字约束泛型参数的类型
在 TypeScript 中,extends
关键字不仅可以用于类的继承,还可以用于泛型约束。通过 extends
,我们可以指定泛型参数必须继承自某个类型或满足某些条件。
示例解析
function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key]; }
T
是一个泛型参数,表示传入的对象类型。K
是另一个泛型参数,表示对象的键类型。K extends keyof T
表示K
必须是T
的键之一。
在这个例子中,getProperty
函数接受两个参数:obj
和 key
。obj
是一个对象,key
是这个对象的键。通过 K extends keyof T
,我们确保了 key
必须是 obj
的键之一,从而避免了传入不存在的键导致的错误。
使用场景
泛型约束常用于以下场景:
- 限制泛型参数的类型范围:确保泛型参数必须是某个特定类型或其子类型。
- 增强代码的类型安全性:通过约束泛型参数,减少运行时类型错误的可能性。
- 提高代码的可读性和可维护性:通过明确的类型约束,使代码更易于理解和维护。
通过合理使用泛型约束,可以编写出更加健壮和类型安全的 TypeScript 代码。