我有一个带有静态方法的类:
class Application {
static get(): string {
...
}
}
现在,我想在另一个类中引用此静态get方法。我知道我可以做到:
class Caller {
klass: { get (): typeof Application["get"] }
}
如果该方法不带任何参数,这很容易工作。 编辑:请在下面查看为什么这是错误的
现在,如果我添加一个参数:
class Application {
static get(argument: string): string {
...
}
}
...我还必须更改Caller
(以及所有其他具有此签名的类):
class Caller {
klass: { get (argument: string): typeof Application["get"] }
}
有办法避免这种情况吗?因为很明显klass.get
始终遵循Application.get
的功能签名。有没有办法告诉打字稿这样的东西:
class Caller {
klass: { get (signatureof typeof Application["get"]): typeof Application["get"] }
}
编辑:实际上,我刚刚意识到以上内容是错误:我实际上将get()
定义为返回的行为类似于{ {1}}。
我对此做了新的尝试:
typeof Application["get"]
...虽然我还没有看到能解决这个问题,brb。
编辑2 :两种方法似乎都可行:
class Caller {
klass: {
[Key in keyof typeof Application]: typeof Application[Key]
}
}
不幸的是,如果references方法更复杂,例如
// reference all properties
class Caller {
klass: {
[Key in keyof typeof Application]: typeof Application[Key]
}
}
// or if only one specific thing is needed
// reference one property
class Caller {
klass: {
get: typeof Application["get"]
}
}
访问在get()
上定义的静态属性,但是这变得更加复杂,因为打字稿将抱怨找不到那些属性(如果仅引用了该方法,而不是每个属性)。
因此,我认为方法是引用所有属性以确保安全。
答案 0 :(得分:3)
您可以使用typeof Class['methodName']
引用静态方法的类型。您可以直接使用此类型作为get
的类型:
class Caller {
klass: {
get: typeof Application["get"]
}
}
这意味着get
与get
的方法Application
相同。 typeof Application["get"]
是方法的整个函数签名,因此对参数或返回类型的任何更改都将反映在get
上的klass
中
答案 1 :(得分:0)
您可以在同一文件中定义get
的类型,如下所示:
type ApplicationGetType = (arg: string) => string;
然后在两个函数定义中都使用它,则对类型定义所做的任何更改只需要做一次。
在引用该方法时,您也可以尝试Parameters<Application['get']>
和ReturnType<Application['get']>
来获取正确的类型。