【发布时间】:2022-01-22 09:55:57
【问题描述】:
假设我有一堂课Foo
class Foo {
bar(){
// anything
}
baz() {
// anything
}
}
我如何创建一个类型ExtractMethods,它将接收一个类并返回一个接口或具有类方法的类型?
例如
type FooMethod = ExtractMethods<Foo> // => { bar(): void; baz(): void; }
我知道对此问题的一个常见评论是“为什么不为Foo 创建一个界面并使用您创建的界面?”
但在我想解决的情况下,Foo 不是我创建的类,而是第三方类。我可以为Foo 创建一个接口,但它永远不会完美地反映这些方法,以防将来类随着更新而发生变化,我还需要更新接口,这是我试图避免的事情。
【问题讨论】:
-
如果您的代码示例显示了一些用例和边缘情况,这会有所帮助,因为现在
type ExtractMethods<T> = T将适用于您的示例。无论如何,this 对你有用吗?据我所知,您无法将方法(存在于类原型中)与函数值属性(往往存在于实例中)区分开来,因此用例真正决定了您想要的是简单/困难/不可能。跨度> -
@jcalz 听起来很完美。我不知道不可能将方法与函数属性区分开来。但对我来说,没关系
-
@jcalz 如果你愿意,请将其添加为答案
-
我想知道是否有一种偷偷摸摸的方法来区分方法和函数值属性,使用方法参数的二元性?我想这不可靠,因为并非所有方法/函数都有参数。
-
@kaya3 是的,如果你有方法参数,你可能会以某种方式进行双方差检查,但据我所知,没有很好的方法来概括这一点。据我所知,映射类型总是将方法转换为 func-props。不过,我很想被证明是错误的!
标签: typescript typescript-generics