能否从现有TypeScript接口中移除不含get属性的顶层属性?
TypeScript 接口过滤:移除不含get属性的顶层字段
给定以下TypeScript接口:
interface Example { '/api/good/path': { get: Record<string, unknown>; parameters: Record<string, unknown>; }; '/api/alsogood/path': { get: Record<string, unknown>; }; '/api/bad/path': { post: Record<string, unknown>; }; '/api/technicallygood/path': { get: Record<string, unknown>; post: Record<string, unknown>; }; }
需求是基于该接口创建新接口,移除所有嵌套对象不包含get属性的顶层属性——也就是保留那些嵌套对象至少包含一个get属性的字段,比如移除'/api/bad/path',保留其余字段。
解决方案
可以通过TypeScript的映射类型和条件类型实现这个过滤逻辑:
// 定义工具类型:过滤出值包含get属性的键 type FilterPathsWithGet<T> = { [K in keyof T as T[K] extends { get: unknown } ? K : never]: T[K]; }; // 创建过滤后的接口 type FilteredExample = FilterPathsWithGet<Example>;
逻辑说明
- 映射类型
[K in keyof T]遍历原接口的所有顶层键; - 条件类型
T[K] extends { get: unknown } ? K : never判断当前键对应的值是否包含get属性(unknown表示不限制get的具体类型),满足条件则保留键,否则用never排除该键; - 最终
FilteredExample的结构完全符合需求:
// FilteredExample 等效于: interface FilteredExample { '/api/good/path': { get: Record<string, unknown>; parameters: Record<string, unknown>; }; '/api/alsogood/path': { get: Record<string, unknown>; }; '/api/technicallygood/path': { get: Record<string, unknown>; post: Record<string, unknown>; }; }
内容的提问来源于stack exchange,提问作者mttvlk
相关产品推荐
相关产品推荐

