我有一个下面的类,上面有一个静态方法。
export default class BProvider {
static fetchSomething() { }
}
const providers: {[key: string]: any} = {
"b": BProvider
};
如果我将BProvider
作为值存储在上面给出的对象文字中,则
我既没有在VSCode中得到自动建议,也没有fetchSomething
带我去定义它的文件。我知道我在any
中使用providers
作为返回类型,但是用any
替换BProvider
甚至无效。
我做错什么了吗?
(providers["b"]).fetchSomething()
答案 0 :(得分:0)
这里存在几个问题,首先,您将变量显式键入为具有索引重新调整类型any
,这意味着所有属性都将为any
类型,因此将不会进行类型检查。如果对象只能包含类型typeof BProvider
的对象,则可以使用该对象代替任何对象。请注意,我说typeof BPRovider
是因为您想要BPRovider
的静态接口而不是实例成员(因为您尝试访问静态方法):
export class BProvider {
static fetchSomething() { }
}
const providers: { [key: string]: typeof BProvider } = {
"b": BProvider
};
providers["b"].fetchSomething() // works
如果要创建映射到不同类型的对象,则可以使用函数来帮助创建提供程序,并在成员上施加某些约束,但会推断出对象文字的实际类型:
export class BProvider {
static fetchSomething() { }
static other() {}
}
function createProviders<T extends { [key: string] : { fetchSomething(): void } }>(value: T) {
return value;
}
const providers = createProviders({
"b": BProvider
});
providers["b"].fetchSomething() // works
providers["b"].other() // works
providers["c"].fetchSomething() // does not work