【问题标题】:Typescript: infer type of property in nested object打字稿:推断嵌套对象中的属性类型
【发布时间】:2021-06-23 09:29:00
【问题描述】:

我正在使用 graphql,ConnectionType 具有属性 pageInfoedges。在这种情况下,我必须使用从edges 映射的pageInfo.hasNextPagepageInfo.endCursornodes。我可以像下面这样手动使用。

const { hasNextPage, endCursor } = pageInfo ?? {};
const nodes = edges.flatMap(edge => edge?.node ?? []) ?? [];

Evenry ConnectionTypepageInfoedges 字段。此外,edge 字段具有 node 字段,因此我可以像上面的代码一样从 edge 映射 node。但是,node 类型可能彼此不同。

这段代码是重复的,所以我想把这个函数提取为util。

interface PageInfo {
  hasNextPage: boolean;
  endCursor: string;
}

interface Connection<Edge> {
  pageInfo: PageInfo;
  edges: Edge[];
}

interface Response<Node> {
  hasNextPage: boolean;
  endCursor: string;
  nodes: Node[];
}

const extractConnectionInfo = <Edge extends { node?: Node }>({ edges, pageInfo }: Connection<Edge>): Response<Node>  => {
   ...parsing work
}

在上面的代码中,我无法推断node 的类型。我收到unknown[] 作为回复。

// type of nodes is "unknown[]"
const { nodes } = extractConnectionInfo({ edges, pageInfo });

有没有办法从嵌套对象的函数参数推断node 类型?嵌套对象为edge,结构如下。

edge: {
  node: {
    ...properties which are different from other node.
  }
}

我可以使用“类型断言”将node 的类型告知 VSCode,但我想从函数参数推断类型。我该怎么办?

【问题讨论】:

    标签: typescript type-inference


    【解决方案1】:

    我认为应该这样做:

    declare const extractConnectionInfo: <
        Edge extends { node?: unknown }
    >(data: Connection<Edge>) => Response<Edge['node']>
    

    playground link

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2020-12-17
      • 2019-10-27
      • 2021-06-19
      • 2021-09-29
      • 2020-11-30
      • 2021-07-02
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多