TypeScript:获取类的实例方法类型

时间:2017-07-20 08:16:12

标签: typescript

我试图获取类的实例方法的类型。除了在类的原型中查找类型之外,还有内置(更好)的方法吗?

class MyClass
{
    private delegate: typeof MyClass.prototype.myMethod; // gets the type ( boolean ) => number;

    public myMethod( arg: boolean )
    {
        return 3.14;
    }
}

提前致谢!

4 个答案:

答案 0 :(得分:6)

您可以为此使用InstanceType内置的TypeScript:

class MyClass
{
  private delegate: InstanceType<typeof MyClass>['myMethod']; // gets the type (boolean) => number;

  public myMethod( arg: boolean )
  {
    return 3.14;
  }
}

答案 1 :(得分:2)

如果你想拥有一个私人方法,但仍然可以使用这个技巧并让它暴露为公开,那么你可以这样做:

class MyClass {
    public myMethodType: typeof MyClass.prototype.myMethod;

    private myMethod(arg: boolean) {
        return 3.14;
    }
}

let fn: typeof MyClass.prototype.myMethodType;

编译为:

var MyClass = (function () {
    function MyClass() {
    }
    MyClass.prototype.myMethod = function (arg) {
        return 3.14;
    };
    return MyClass;
}());
var fn;

正如您所看到的,myMethodType成员不是已编译的js的一部分,这很好,因为它仅用于其类型。

答案 2 :(得分:1)

您可以使用以下类型:

type TypeOfClassMethod<T, M extends keyof T> = T[M] extends (...args: any) => any ? T[M] : never;

这样,您可以编写以下内容:

class MyClass
{
  private delegate: TypeOfClassMethod<MyClass, 'myMethod'>; // gets the type (boolean) => number;

  public myMethod( arg: boolean )
  {
    return 3.14;
  }
}

答案 3 :(得分:1)

最简单和最惯用的方法似乎是:

type MyMethodType = MyClass['myMethod'];

它似乎没有任何缺点。而且,作为 @cuddlefish points out,如果 MyClass 是通用的,它也可以工作。