typescript - 对于从对象文字访问的函数,上下文类型不会向后流动?
问题描述
我有下面的类,上面有一个静态方法。
export default class BProvider {
static fetchSomething() { }
}
const providers: {[key: string]: any} = {
"b": BProvider
};
如果我将BProvider
值存储为上面给出的对象文字,那么我既不会在 VSCode 中获得自动建议,也不会将fetchSomething
我带到定义它的文件。我知道我已将其用作any
返回类型,providers
但替换any
为BProvider
甚至不起作用。
我做错什么了吗?
(providers["b"]).fetchSomething()
解决方案
这里有几个问题,首先您将变量显式键入为具有索引重新调整类型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
推荐阅读
- javascript - Visual Studio Code Chrome 调试器 - 开始调试时出错
- smtp - 通过 Microsoft Exchange Server 使用 Pentaho 发送邮件
- r - 如何在 r 的函数中使用数据框
- php - 如何配置 laravel 5 和 gclid
- c# - “System.Runtime,版本=4.2.1.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”无法加载
- vue.js - 无法在父组件上监听子组件发出的事件
- python - 用于监控程序和控制微控制器的 Python 脚本
- nginx - Nginx 只允许我的域访问视频 url
- android - Android studio 3.5:logcat 不显示任何日志
- c++ - 为什么这里会出现“使用未初始化的内存'猜测'”?