Typescript:如何过滤接口以创建仅具有匹配pop的类型

igsr9ssn  于 2023-02-13  发布在  TypeScript
关注(0)|答案(3)|浏览(89)

给定如下接口

interface paths {
  "/api/user/{id}": {
    get: operations["getUserGET"];
  };
  "/api/user/add": {
    put: operations["addUsingPUT"];
  };
  ...
}

我如何通过http方法(get、put、post等)创建子类型过滤?
其结果可能类似于:

type getPaths = AwesomeFilter<paths, 'get'>

/* equivalent to: */
interface getPaths {
  "/api/user/{id}": {
    get: operations["getUserGET"];
  };
  /* only gets on the interface */
}
v8wbuo2f

v8wbuo2f1#

可以使用下面的自定义类型根据嵌套属性上存在的方法进行筛选。

type MethodOf<T, M extends 'delete' | 'get' | 'post' | 'put'> = {
  [K in keyof T]: T[K] extends Record<M, unknown>
    ? Pick<T[K], M>
    : never
}

您可以这样使用它:

interface paths {
  "/api/user/{id}": {
    get: operations["getUserGET"];
  };
  "/api/user/add": {
    put: operations["addUsingPUT"];
  };
  ...
}

type getPaths = MethodOf<paths, 'get'>
//   ^? { "/api/user/{id}": { get: operations["getUserGET"] } }
eyh26e7m

eyh26e7m2#

如果我正确理解了这个问题,您可以使用“Pick”工具类型来执行此操作:
type getPaths = Pick<paths, 'get'>;
也就是说,在您的示例中,您似乎混淆了类型定义和对象常量,因此这并不十分清楚。
还请注意,TypeScript约定建议类型名称以大写字母开头-例如PathsGetPaths等。

cwxwcias

cwxwcias3#

您可以使用PickyByType实用程序类型。说明如下:https://stackoverflow.com/a/69756175

type PickByType<T, Value> = {
  [P in keyof T as T[P] extends Value | undefined ? P : never]: T[P];
};

对于'get',则为PickByType<T, {get: unknown}>
AwesomeFilter现在可以挑选具有给定属性的所有类型。

type AwesomeFilter<T, Property extends string> =  PickByType<T, {[P in Property]: unknown}>

相关问题