从对象文字访问的函数的上下文类型输入不会倒退吗?

时间:2018-06-20 15:05:52

标签: typescript typescript-typings

我有一个下面的类,上面有一个静态方法。

export default class BProvider { static fetchSomething() { } }

const providers: {[key: string]: any} = { "b": BProvider };

如果我将BProvider作为值存储在上面给出的对象文字中,则  我既没有在VSCode中得到自动建议,也没有fetchSomething带我去定义它的文件。我知道我在any中使用providers作为返回类型,但是用any替换BProvider甚至无效。

我做错什么了吗?

(providers["b"]).fetchSomething()

1 个答案:

答案 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