TypeScript如何创建仅匹配string/number属性的泛型PrimaryKey类型
TypeScript 实现
PrimaryKey<T> 泛型 核心通过映射类型+条件类型+索引访问的组合实现,代码如下:
type PrimaryKey<T> = { [K in keyof T]: T[K] extends string | number ? K : never }[keyof T];
实现逻辑拆解
- 遍历属性:
[K in keyof T]会遍历传入类型T的所有属性键,生成同结构的映射类型 - 类型过滤:通过条件类型
T[K] extends string | number ? K : never逐个校验属性值类型:如果值是string或number,就保留当前属性键,否则返回never标记为无效 - 提取合法键:最后用
[keyof T]做索引访问,自动剔除联合类型中的never成员,最终得到所有符合要求的主键键名联合类型
效果验证
用题目给出的User接口测试:
interface User { id: number; name: string; email: string; address: { country: string; city: string; state: string; street: string; } active: boolean; } // 推导结果:type UserPrimaryKey = "id" | "name" | "email",完全匹配需求 type UserPrimaryKey = PrimaryKey<User>;
其中address是对象类型、active是布尔类型,都会被自动过滤,不会出现在最终的联合类型里。
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

