【问题标题】:How to programmatically get the type of a variable and use it as a function parameter's type?如何以编程方式获取变量的类型并将其用作函数参数的类型?
【发布时间】:2021-10-10 07:27:18
【问题描述】:

我有一个关于 TypeScript 4.1.5 的类型问题。

考虑以下示例。我在getItems 中进行了 GraphQL 查询,结果items 隐含地知道调用此函数后生成的未命名类型。后来想做一个map操作,需要为每个元素指定一个类型。

const items = getItems();  // calling a GraphQL query

const transformedItems = items.map((item: any) => {
  return {
    // transformation logic here
  };
});

在 VSCode 中将鼠标悬停在 items 上会发现该类型是一个未命名的生成类型的数组,该数组专门包含我在 getItems 的 GraphQL 查询中要求的属性和连接器:

const items: ({
    __typename?: "myItem" | undefined;
} & Pick<myItem, "id" | "createdAt" | "updatedAt" | "apiId" | "lastUpdated" | "balanceAfterThis" | ... 23 more ... | "apiCreatedAt">)[]

现在我只使用了any 类型,因为我无法导入生成的类型并在此处使用它。 (我认为graphql-codegen 并没有费心给它一个名称来导出它。)我知道这个any 类型的解决方案会掩盖如果我可以在这里指定正确的类型就会被捕获的错误。我想使用正确的类型,但我不知道该怎么做。

(另外我不想为了避免类型问题而将映射操作重写为循环。)

(另外我不想手动写出这个生成的类型,因为 GraphQL 函数以后可能会更改,我也必须更改手动类型定义。)

有没有办法以编程方式获取存储在items 中的类型并在映射操作中使用它?或者也许有另一种方法来解决这种类型的问题?请告诉我。感谢您的时间和考虑。

【问题讨论】:

    标签: typescript types typescript-generics


    【解决方案1】:

    是的,我的框架可以完美解决你的问题。

    https://github.com/babyfish-ct/graphql-ts-client

    此GraphQL typescript客户端可以根据强类型查询请求自动推断返回数据的类型,其他同类客户端框架无法做到。

    你看,所有查询的字段都可以被IDE推荐!它统一了动态和强类型。

    返回的类型是自动推断的,因此您可以根据需要编写地图函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多