gpt4 book ai didi

typescript :类属性的索引签名

转载 作者:行者123 更新时间:2023-12-03 19:32:22 25 4
gpt4 key购买 nike

尝试动态访问我的静态和实例化类属性时,我收到有关索引签名的错误。我发现很多人在网上谈论这个错误,但我还没有解决这个问题。

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

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 选项即可显示错误。

非常感谢!

最佳答案

有一个open issue on TypeScript's GitHub围绕这几年。目前似乎不可能有静态索引签名。

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

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

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

关于 typescript :类属性的索引签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com