我正在尝试用Typescript编写一个库,假设我得到了以下类:
class SomeService {
fn1(commonParam: string, a: number, b: string): string {
}
fn2(commonParam: string, c: Date): string {
}
}
是否可以在Typescript中编写一个高阶函数,如果像这样调用:
const ResultService = transform(SomeService);
将导致具有以下类型的const:
const ResultService: class {
fn1(a: number, b: string): void {
}
fn2(c: Date): void {
}
}
所以基本上,这将导致const
将是具有相同函数的类,但是删除了commonParam,并且返回类型不同。我们的想法是包装这个类,并通过库的引擎传递这些参数。
如果更简单,另一种选择是将类编写为:
class SomeService {
fn1 = (commonParam: string) => (a: number, b: string): string => {
}
fn2 = (commonParam: string) => (c: Date): string => {
}
}
或者:
class SomeService {
fn1 = (a: number, b: string) => (commonParam: string): string => {
}
fn2 = (c: Date) => (commonParam: string): string => {
}
}
并让高阶函数将类中的函数转换为不带(commonParam: string)
的版本,就像前面的示例一样。
我一直试图在谷歌上找到一个解决方案,但到目前为止我还不能,我开始认为这是不可能的,但我只是在这里做最后一次尝试。
在Javascript中进行这种转换很容易,但我希望它是强类型的。
提前感谢你的帮助。
发布于 2018-12-11 08:23:14
您可以使用映射类型、条件类型和rest元组扩展的组合来完成此操作:
type RemoveCommonParam<T extends {}> = {
[TKey in keyof T]:
T[TKey] extends (commonParam: string, ...args: infer TArgs) => unknown
? (...args: TArgs) => void
: T[TKey];
}
https://stackoverflow.com/questions/53715597
复制相似问题