首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在typescript中修改具有高阶函数的类中所有函数的签名

在typescript中修改具有高阶函数的类中所有函数的签名
EN

Stack Overflow用户
提问于 2018-12-11 08:10:04
回答 1查看 24关注 0票数 0

我正在尝试用Typescript编写一个库,假设我得到了以下类:

代码语言:javascript
复制
class SomeService {
  fn1(commonParam: string, a: number, b: string): string {
  }

  fn2(commonParam: string, c: Date): string {
  }
}

是否可以在Typescript中编写一个高阶函数,如果像这样调用:

const ResultService = transform(SomeService);

将导致具有以下类型的const:

代码语言:javascript
复制
const ResultService: class {
  fn1(a: number, b: string): void {
  }

  fn2(c: Date): void {
  }
}

所以基本上,这将导致const将是具有相同函数的类,但是删除了commonParam,并且返回类型不同。我们的想法是包装这个类,并通过库的引擎传递这些参数。

如果更简单,另一种选择是将类编写为:

代码语言:javascript
复制
class SomeService {
  fn1 = (commonParam: string) => (a: number, b: string): string => {
  }

  fn2 = (commonParam: string) => (c: Date): string => {
  }
}

或者:

代码语言:javascript
复制
class SomeService {
  fn1 = (a: number, b: string) => (commonParam: string): string => {
  }

  fn2 = (c: Date) => (commonParam: string): string => {
  }
}

并让高阶函数将类中的函数转换为不带(commonParam: string)的版本,就像前面的示例一样。

我一直试图在谷歌上找到一个解决方案,但到目前为止我还不能,我开始认为这是不可能的,但我只是在这里做最后一次尝试。

在Javascript中进行这种转换很容易,但我希望它是强类型的。

提前感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-11 08:23:14

您可以使用映射类型、条件类型和rest元组扩展的组合来完成此操作:

代码语言:javascript
复制
type RemoveCommonParam<T extends {}> = {
  [TKey in keyof T]:
      T[TKey] extends (commonParam: string, ...args: infer TArgs) => unknown
      ? (...args: TArgs) => void
      : T[TKey]; 
}

Demo

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53715597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档