typescript - 在我们的工厂加载器模式中获取正确的返回类型值
问题描述
以下示例正在运行(在 JavaScript 中),但我无法在 TypeScript 中获得正确的返回类型。根据工厂对象,应该知道“func”函数的正确返回类型。
我们希望使用这种模式来动态添加和获取 DataLoaders。
class Dog {
bark() { console.log("wuff")}
}
class Cat {
miau() { console.log("miau")}
}
class FactoryItem<T extends () => {}> {
constructor(public func: T) {}
}
class Factories {
factories = new Map();
add<T extends () => {}> (factories: FactoryItem<T>) {
this.factories.set(factories,factories.func())
}
get<T extends FactoryItem<()=>{}>>(factory:T):ReturnType<typeof factory.func> { // this is not working
return this.factories.get(factory)
}
}
const factoryA = new FactoryItem(() => new Dog());
const factoryB = new FactoryItem(() => new Cat());
const factories = new Factories();
factories.add(factoryA)
factories.add(factoryB)
factories.get(factoryA).bark(); // typescript is not happy
//factorys.get(factoryB).bark(); // this must fail
factories.get(factoryB).miau(); // typescript is not happy
解决方案
在这个函数的返回类型中——
get<T extends FactoryItem<()=>{}>>(factory: T):ReturnType<typeof factory.func> { // this is not working
return this.factories.get(factory)
}
您声称 of 的返回类型get
是的返回类型factory.func
- 但这只是一个不依赖于泛型类型的常量类型。
如果您希望您的返回类型受到泛型类型的影响 - 您必须使用泛型类型,也就是T
-
get<T extends FactoryItem<()=>{}>>(factory: T):ReturnType<T['func']> {
return this.factories.get(factory)
}
请记住,在使用泛型函数期间泛型的上下文仅由泛型类型(在这种情况下T
)捕获 - 因此,任何时候您想要基于捕获的上下文构造类型,您需要根据泛型类型参数(在这种情况下T
)。
这是游乐场链接
推荐阅读
- machine-learning - 如何在 SimpleImputer 中选择策略
- reactjs - React 无法从返回中访问变量
- git - 如何从私有远程存储库中删除旧的 git 条目?
- django - 如何使 django 上传的图像显示在 CloudFront 前端 + Beanstalk 后端
- api - 亚马逊产品广告 API - 检查购物车中的商品是否实际购买?
- git - 创建基于 ssh 的远程路径
- mule-studio - Mule Munit 模拟和间谍功能
- ssh - gcloud 在提交新的 SSH 密钥对时创建了一个新帐户,现在我无法访问原始帐户
- javascript - 无法在画布上加载 svg
- c++ - 为什么 c++(g++) 允许模板返回类型和函数名之间没有空格?