我正在使用 graphql,并且有 ConnectionType
具有属性 pageInfo
和 edges
。在这种情况下,我必须使用从 pageInfo.hasNextPage
映射的 pageInfo.endCursor
和 nodes
以及 edges
。我可以像下面这样手动使用。
const { hasNextPage, endCursor } = pageInfo ?? {};
const nodes = edges.flatMap(edge => edge?.node ?? []) ?? [];
每一个 ConnectionType
都有 pageInfo
和 edges
字段。此外,edge
字段具有 node
字段,因此我可以像上面的代码一样从 node
映射 edge
。但是,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,但我想从函数参数中推断类型。我该怎么办?
答案 0 :(得分:0)
我认为应该这样做:
declare const extractConnectionInfo: <
Edge extends { node?: unknown }
>(data: Connection<Edge>) => Response<Edge['node']>