打字稿类型中的引用静态方法:自动获取方法签名

时间:2019-05-10 10:26:29

标签: typescript static

我有一个带有静态方法的类:

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()上定义的静态属性,但是这变得更加复杂,因为打字稿将抱怨找不到那些属性(如果仅引用了该方法,而不是每个属性)。

因此,我认为方法是引用所有属性以确保安全。

2 个答案:

答案 0 :(得分:3)

您可以使用typeof Class['methodName']引用静态方法的类型。您可以直接使用此类型作为get的类型:

class Caller {
  klass: {
    get: typeof Application["get"]
  }
}

这意味着getget的方法Application相同。 typeof Application["get"]是方法的整个函数签名,因此对参数或返回类型的任何更改都将反映在get上的klass

答案 1 :(得分:0)

您可以在同一文件中定义get的类型,如下所示:

type ApplicationGetType = (arg: string) => string;

然后在两个函数定义中都使用它,则对类型定义所做的任何更改只需要做一次。

在引用该方法时,您也可以尝试Parameters<Application['get']>ReturnType<Application['get']>来获取正确的类型。