首页 > 解决方案 > 在我们的工厂加载器模式中获取正确的返回类型值

问题描述

以下示例正在运行(在 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


标签: typescript

解决方案


在这个函数的返回类型中——

  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)。

这是游乐场链接


推荐阅读