如何在TypeScript中为静态属性和方法调用注释类别名?

时间:2019-05-01 05:00:21

标签: typescript types

以下代码中self局部变量的哪种类型正确?

class SuperHyperMegaExtraVeryPrettyLongClassName {

  static exampleProperty1: number = 1;
  static exampleProperty2: string = 'asdf';

  private someMethod(): void {
    // invalid type
    const self: SuperHyperMegaExtraVeryPrettyLongClassName = SuperHyperMegaExtraVeryPrettyLongClassName;
    console.log(self.exampleProperty1, self.exampleProperty2);
  }
}

2 个答案:

答案 0 :(得分:1)

Typescript类型系统是 duck-typing ,这意味着self变量的正确类型可能表明您打算如何使用它。在这种情况下,它必须具有您引用的两个属性。

class SuperHyperMegaExtraVeryPrettyLongClassName {

  static exampleProperty1: number = 1;
  static exampleProperty2: string = 'asdf';

  private someMethod(): void {
    const self: {exampleProperty1: number,exampleProperty2: string} = SuperHyperMegaExtraVeryPrettyLongClassName;
    console.log(self.exampleProperty1, self.exampleProperty2);
  }
}

让我知道这是否对您有用!

答案 1 :(得分:1)

当您想要 class 的类型而不是 instance 的类型时,可以使用typeof作为类型查询:

class X {
  static y: number = 1;
  static z: string = 'hi';
  private someMethod(): void {
    const Class: typeof X = X;
    console.log(Class.y, Class.z);
  }
}

您现在不能以一般的方式安全地执行此操作(有关详细信息,请参见Microsoft/TypeScript#3841),但是您可以解决以下所有消费者typeof Y的需求Y,如果该类具有实例类型的实例属性:

type Class<T> = T extends Object ? T['constructor'] : never;

class Y {
  'constructor': typeof Y;  // Quotes are important
}
type XClass = Class<X>; // Function
type YClass = Class<Y>; // typeof Y;