Typescript:类属性的索引签名

时间:2018-11-07 15:38:46

标签: typescript

当尝试动态访问我的静态和实例化类属性时,出现关于索引签名的错误。我发现很多人都在网上谈论此错误,但是我还无法解决该问题。

我能够在一个简单的类上重现该问题:

interface MyClassInterface {
  name: string;
  getInstanceProperty( propertyName: string ): string;
  getStaticProperty( propertyName: string ): number;
}

class MyClass implements MyClassInterface {

  public name: string;

  private static age: number;

  public constructor( theName: string, theAge: number ) {

    this.name = theName;
    MyClass.age = theAge;

  }

  public getInstanceProperty( propertyName: string ): string {

    return this[propertyName];
    // Typescript error:
    // Element implicitly has an 'any' type because type 'MyClass' has no index signature.

  }

  public getStaticProperty( propertyName: string ): number {

    return MyClass[propertyName];
    // Typescript error:
    // Element implicitly has an 'any' type because type 'typeof MyClass' has no index signature.

  }

}

const myClass = new MyClass( "John", 35 );

console.log(
  myClass.getInstanceProperty( "name" ),
  myClass.getStaticProperty( "age" )
); // Outputs "John 35" in the console

我发现可以通过在类内部添加如下类型信息来避免getInstanceProperty()中的错误:

class MyClass implements MyClassInterface {
  [key: string]: any;

  // ...
}

是否可以在类接口中添加它?我还没有做到。 我想我需要对静态属性进行类似的修改,但是我不知道该怎么做。有想法吗?

我已在TypeScript Playground中复制了此代码。您只需要启用noImplicitAny选项即可显示错误。

非常感谢!

2 个答案:

答案 0 :(得分:0)

围绕open issue on TypeScript's GitHub已经有好几年了。当前似乎没有静态索引签名。

我认为解决此限制的唯一方法是通过使用如下所示的类型断言来让编译器知道您的类具有静态索引签名,从而帮助编译器解决问题。

interface Indexable {
  [key: string]: any;
}

class MyClass {
    ...
    public getStaticProperty( propertyName: string ): number {
      return (MyClass as Indexable)[propertyName];
    }
    ...
}

答案 1 :(得分:0)

另一个解决方案可以是:

class MyClass {

    public static myMethod(variable:any):string{

    }

}

interface Indexable {
    [key:string]:any;
}

export const MyExportedClass = MyClass as Indexable;