【问题标题】:Getting keys and value types of not instantiated Generic Type获取未实例化的通用类型的键和值类型
【发布时间】:2021-02-16 12:13:49
【问题描述】:

我正在创建一个辅助方法来为我们的测试生成数据。我想要的只是能够获取 T 的值的键和类型,以便我可以使用它来创建模拟值。

export class GenericMockFactory<T extends { id: number }>> {

makeMockModel(): T {
    return {
      //Mocked Data Here
    }
  }
}

假设 T 是

Model {
  id: number
  name: string
  country: string
}

我有 mockFactory 作为

const mockFactory = GenericMockFactory<Model>

如果属性类型是字符串,我希望 mockFactory.makeMockModel() 的返回值设置为 Model 对象,如果属性类型是数字,则返回 1。对于上面的例子:

{
  id: 1
  name: 'any_name'
  country: 'any_country'
}

我尝试过的:

Object.entries(T).forEach(),如果我实例化了对象,我会去,我似乎无法传递类型。

【问题讨论】:

  • 这类似于this question。静态类型系统在将 TS 转换为 JS 时被删除,因此唯一的方法是让 JS “模式”对象代表 TS 类型。您可以手动完成,也可以使用自定义 TS 转换器以编程方式完成。

标签: typescript typescript-generics


【解决方案1】:

这可能会有所帮助:https://stackoverflow.com/a/43572554/8350634

function mockObject(obj) {
    const newObj = {};
    const keys = Object.keys(obj);
    for(const key of keys) {
        if(typeof newObj[key] == "string") {
            newObj[key] = 'any' + key;
        } else {
        
            newObj[key] = 1;
        }
    }
    return newObj;
}

【讨论】:

  • 但这不是需要我传入一个 T 类型的对象吗?我希望能够将 T 作为类型参数传递并从中生成对象。有办法吗?
  • 哦,我现在明白你的意思了。这只有在typeprototype 时才有可能
  • 所以基本上,只有在其他地方实例化然后传入,对吧?
  • 是的,但您也可以在函数中实例化它。如果它没有构造函数,我猜。
  • 也许这对你也有帮助:stackoverflow.com/a/43572554/8350634
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多