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 not
fetchSomething
中,我既没有得到自动建议,也没有得到自动建议,它会将我带到一个定义它的文件。我知道我在
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