Typescript 对于从对象文本访问的函数,上下文类型不会向后流动?
我有一个静态方法的类Typescript 对于从对象文本访问的函数,上下文类型不会向后流动?,typescript,typescript-typings,Typescript,Typescript Typings,我有一个静态方法的类 导出默认类BProvider{ 静态fetchSomething(){} } const提供程序:{[key:string]:any}={ “b”:b供应商 }; 如果我将BProvider存储为上面给定的对象文本中的值,那么 在VSCode notfetchSomething中,我既没有得到自动建议,也没有得到自动建议,它会将我带到一个定义它的文件。我知道我在providers中使用了any作为返回类型,但将any替换为BProvider甚至不起作用 我做错什么了吗 (p
导出默认类BProvider{
静态fetchSomething(){}
}
const提供程序:{[key:string]:any}={
“b”:b供应商
};代码>
如果我将BProvider
存储为上面给定的对象文本中的值,那么
在VSCode notfetchSomething
中,我既没有得到自动建议,也没有得到自动建议,它会将我带到一个定义它的文件。我知道我在providers
中使用了any
作为返回类型,但将any
替换为BProvider
甚至不起作用
我做错什么了吗
(providers[“b]”)。fetchSomething()
这里有几个问题,首先,您显式键入变量,将其作为索引重新调整类型any
,这意味着所有属性都属于any
类型,因此您将无法进行类型检查。如果对象只能包含类型为typeof BProvider
的对象,则可以使用该对象而不是任何类型的对象。请注意,我说了typeof BPRovider
,因为您想要的是BPRovider
的静态接口,而不是实例成员(因为您试图访问静态方法):
如果要创建映射到不同类型的对象,可以使用函数帮助创建提供程序,并对成员强制某些约束,但将推断对象文字的实际类型:
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
导出类BProvider{
静态fetchSomething(){}
静态其他(){}
}
函数createProviders(值:T){
返回值;
}
const providers=createProviders({
“b”:b供应商
});
提供程序[“b”]。fetchSomething()//有效
提供程序[“b”]。其他()//有效
提供程序[“c”]。fetchSomething()//不起作用
这不仅仅是上下文键入问题。。。事实上,BProvider
构造函数不是BProvider
类型,这与日期
构造函数本身不是日期
一样。将any
更改为typeof BProvider
并查看它是否有效。您的另一个问题是,通过将providers
注释为{[key:string]:any}
您告诉TypeScript忘记providers.b
将是一种特殊类型的东西。没有什么能阻止您编写providers.b=123
,因此后续的提供程序.b.fetchSomething()
是一个错误。
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