TypeScript映射类型更改值函数的返回类型

时间:2019-10-18 20:26:51

标签: typescript

我有一个像这样的TypeScript类型:

type Api = {
  createItem: (name: string) => Promise<Item>;
  getItem: (id: number) => Promise<Item>;
  updateItem: (item: Item) => Promise<Item>;
  deleteItem: (id: number) => Promise<void>;
};

我正在尝试找出如何将其转换为以下内容:

type Api = {
  createItem: (name: string) => { type: 'success'; result: Item; } | { type: 'error' };
  getItem: (id: number) => { type: 'success'; result: Item; } | { type: 'error' };
  updateItem: (item: Item) => { type: 'success'; result: Item; } | { type: 'error' };
  deleteItem: (id: number) => { type: 'success' } | { type: 'error' };
};

我认为映射类型是一种解决方法:

type NewApi = {
  [_ in keyof Api]: (???) => { type: 'success'; result: ??? } | { type: 'error' }
};

不过,我无法弄清楚如何填补空白。我什至不确定是否可以这样做。

我需要这种类型的原因是,我正在构建网关代理,并且该类型的实际实现将是一个实际的Proxy对象,该对象将拦截成员访问,并使用另一个代理来模拟其值,该代理可以捕获函数调用更改并返回上述联合类型。

实现部分很好,但是我似乎无法获得它的类型以使Intellisense工作。

1 个答案:

答案 0 :(得分:1)

您可以使用打字稿ParametersReturnType类型

type NewApi = {
  [K in keyof Api]: (...args: Parameters<Api[K]>) => { type: 'success'; result: ReturnType<Api[K]> } | { type: 'error' }
};

请参阅此playground