首页 > 解决方案 > 对于从对象文字访问的函数,上下文类型不会向后流动?

问题描述

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

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

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

如果我将BProvider值存储为上面给出的对象文字,那么我既不会在 VSCode 中获得自动建议,也不会将fetchSomething我带到定义它的文件。我知道我已将其用作any返回类型,providers但替换anyBProvider甚至不起作用。

我做错什么了吗?

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

标签: typescripttypescript-typings

解决方案


这里有几个问题,首先您将变量显式键入为具有索引重新调整类型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 

推荐阅读