首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Typescript Generic with in keyof

基础概念

TypeScript 中的泛型(Generics)是一种允许你创建可重用的组件的方法,这些组件可以在多种类型上工作,而不是单一类型。keyof 是 TypeScript 中的一个关键字,它用于获取一个对象类型的所有键(属性名)的联合类型。

当你将泛型与 keyof 结合使用时,你可以创建一个泛型约束,该约束确保传入的类型参数必须是某个对象类型的键之一。

优势

  • 类型安全:通过使用泛型和 keyof,你可以在编译时捕获更多的错误,因为你可以确保传入的类型是预期的对象属性之一。
  • 代码复用:泛型允许你编写更通用的代码,这些代码可以在不同的类型上重用,而不需要为每种类型编写单独的实现。
  • 可读性和维护性:使用泛型可以使代码更加清晰和易于理解,因为它明确地表达了代码的意图和约束。

类型

代码语言:txt
复制
function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

在这个例子中,T 是任意类型,KT 的键的联合类型。函数 getProperty 接受一个对象 obj 和一个键 key,并返回该键对应的值。

应用场景

当你需要编写一个函数,该函数接受一个对象和一个属性名,并返回该属性的值时,可以使用泛型和 keyof。这样可以确保传入的属性名是对象的有效属性。

示例代码

代码语言:txt
复制
interface Person {
    name: string;
    age: number;
}

function getPersonProperty(person: Person, key: keyof Person): any {
    return person[key];
}

const person: Person = {
    name: "John Doe",
    age: 30
};

console.log(getPersonProperty(person, "name")); // 输出: John Doe
console.log(getPersonProperty(person, "age"));  // 输出: 30

参考链接

常见问题及解决方法

问题:为什么我使用 keyof 时编译器报错?

原因:可能是因为你尝试使用 keyof 在非对象类型上,或者你的类型参数没有正确约束。

解决方法:确保你使用的类型是一个对象类型,并且你的泛型参数正确地使用了 extends keyof T 这样的约束。

代码语言:txt
复制
// 错误示例
function getLength<T>(arr: T): number {
    return arr.length; // 如果 T 不是数组类型,这里会报错
}

// 正确示例
function getLength<T extends Array<any>>(arr: T): number {
    return arr.length; // 现在这里不会报错,因为 T 被约束为数组类型
}

问题:如何处理 keyof 和联合类型的组合?

原因:当你有一个联合类型,并且你想使用 keyof 来获取这些类型的键时,可能会遇到类型不兼容的问题。

解决方法:使用映射类型(Mapped Types)来处理联合类型的键。

代码语言:txt
复制
type UnionType = { a: number } | { b: string };

type Keys = keyof UnionType; // 这将导致错误,因为联合类型的键不能直接使用 keyof

// 使用映射类型来解决
type KeysUnion<T> = T extends any ? keyof T : never;

type Keys = KeysUnion<UnionType>; // 现在 Keys 将是 "a" | "b"

通过这些方法,你可以更好地理解和解决在使用 TypeScript 泛型和 keyof 时可能遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript - keyof

TypeScript 中,keyof 关键字是一个有用的类型操作符,它用于获取一个类型所有公共属性键的联合(Union)。当你想要操作一个类型的键而不是它的值时,keyof 操作符非常有用。...keyof Person 将包含所有这些可能的键以及明确声明的属性键 "age"。 类型守卫和断言 keyof 可以用来创建类型守卫,确保某个键存在于对象中。...与泛型结合 keyof 可以与泛型结合使用,以提供更通用的类型。...泛型 K 被约束为 T 的键之一,这样 TypeScript 就可以确保键是有效的。 keyofTypeScript 提供的一个强大的工具,它允许你以类型安全的方式操作对象的键。...通过使用 keyof,你可以编写出更灵活和可重用的代码。

13810
  • TS中keyof和typeof

    方案 使用keyof解决这种问题: function getProp(obj: T, key: keyof T) { return obj[key] } console.log(getProp...我的目的就是,把那句Colors as any改掉,如果想用keyof的话,那么我们起码要获取到Colors的类型,但是这里他是一个字面量对象,所以本文要提到的另一个东西就引出来了,它就是typeof。...所以我们的getColor方法可以这样写: function getColor(key: keyof Color) { return Colors[key] } 综合一下,变成下面这样: function...getColor(key: keyof typeof Colors) { return Colors[key] } 再进阶 如果我想让输入#FF0000这样的字符串并且把Red返回去,那么在不改变...[0] } console.log(getColorName('#FF0000')) // Red 一定要有as const,不然TS编译器只能推导出Color[keyof Color]是string

    1.2K20

    速查手册 - TypeScript 高级类型 cheat sheet

    温馨提示:因微信中外链都无法点击,请通过文末的” “阅读原文” 到技术博客中完整查阅版;(本文整理自技术博客) 学习 TypeScript 到一定阶段,必须要学会高阶类型的使用,否则一些复杂的场景若是用...附 中文文档,有人做了专门的读书笔记 Typescript学习记录:高级类型 TypeScript: Built-in generic types:推荐,用案例详细解释高阶类型的使用; TS 一些工具泛型的使用及其实现...:TS 内置工具泛型高阶使用 TypeScript 2.1 新特性一览:查找/映射类型及 any 类型的推断 都是在 2.1 版本引入的 TypeScript 2.8:Exclude 等条件类型是在 2.8...版本引入的,附中文 TypeScript 2.8 引入条件类型 lib.es2015.d.ts:大部分的声明在这个文件中可以找到 TypeScript 强大的类型别名:行文结构比较合理,也比较完善,可以当手册来查...X : Y 表示,如果 T 可以赋值给 U (类型兼容),则返回 X,否则返回 Y; 1.3、使用 `keyof` 和 `in` keyof 可以用来取得一个对象接口的所有 key 值: interface

    1.3K10

    探索TypeScript的映射类型,从简单到高级的7个实例

    keyof 操作符:keyofTypeScript中的一个操作符,它返回一个类型的所有属性名的联合类型。...泛型类型(Generic types):泛型类型是创建依赖于另一种类型的类型的方法。例如,Type是一个依赖于 T 的泛型类型。...同样,在TypeScript中,映射类型可以遍历类型的每个属性并对其进行转换。 二、 将类型属性设为可选 在TypeScript中,我们常常需要将某个类型的所有属性设为可选属性。...掌握这一技巧可以让你在开发TypeScript应用时更加灵活地处理类型转换问题。 三、将可选属性设为必需属性 在TypeScript中,有时我们需要将类型中所有可选属性变为必需属性。...掌握这一技巧可以让你在开发TypeScript应用时更加灵活地处理类型转换问题。 四、将属性设为只读 在TypeScript中,有时我们需要将某个类型的所有属性设为只读。

    24510

    深入理解 TypeScript 中的 Keyof 运算符,让你的代码更安全、更灵活!

    keyof 运算符是在 TypeScript 2.1 版本中引入的。这个关键字已经成为 TypeScript 中高级类型的基石,并在代码中经常使用。...一、如何定义 KeyOf 运算符 在 TypeScript 中,keyof 运算符用于获取用户定义的值。它主要用于泛型,格式类似于联合运算符及其属性。keyof 运算符会检索用户指定的值的索引。...二、在泛型中使用 KeyOf 运算 使用 KeyOf 运算符应用约束 在 TypeScript 中,keyof 运算符常用于在泛型函数中应用约束。...三、 KeyOf 与映射类型的结合使用 在 TypeScript 中,我们可以使用 keyof 运算符与映射类型结合,将现有类型转换为新类型。...结束 TypeScriptkeyof 运算符虽然小巧,但却是 TypeScript 机制中不可或缺的一环。

    19510

    TypeScript 官方手册翻译计划【七】:类型操控-类型操作符

    说明:目前网上没有 TypeScript 最新官方文档的中文翻译,所以有了这么一个翻译计划。...因为我也是 TypeScript 的初学者,所以无法保证翻译百分之百准确,若有错误,欢迎评论区指出; 翻译内容:暂定翻译内容为 TypeScript Handbook,后续有空会补充翻译文档的其它部分;...项目地址:TypeScript-Doc-Zh,如果对你有帮助,可以点一个 star ~ 本章节官方文档地址:Keyof Type Operator、Typeof Type Operator Keyof...类型操作符 keyof 类型操作符 keyof 类型操作符接受一个对象类型作为参数,并基于它的键产生一个由字符串字面量或者数值字面量组成的联合类型。...= keyof Point 如果 keyof 操作的类型有 string 或者 number 类型的索引签名,那么 keyof 会返回该索引签名的类型: type Arrayish = {

    57920
    领券