Typescript:获取类型的第一个属性的类型

7jmck4yq  于 2023-04-22  发布在  TypeScript
关注(0)|答案(3)|浏览(236)

我得到一个嵌套对象作为GraphQL查询的结果,查询名称作为第一级键,实际数据在第二级:

{
    getProduct: {
        id: "1",
        name: "test",
    }
}

在我的查询函数中,我自动提取对象的第一个键并返回getProduct的值。然而,我想推断第一个键的类型作为查询函数的返回值。

type QueryReturn = FirstElement<GetProductQuery>; // should be { id: string; name: string }

我在互联网上找到的所有解决方案都推断数组或函数的头部或尾部。

oaxa6hgo

oaxa6hgo1#

有点晚了。如果你能确保你总是在最外面的类型中有一个键,你可以通过使用keyof操作符和索引访问类型来做到这一点。
如果在最外层的类型中没有键或有多个键,这将表现得很奇怪,所以请确保在所有场景中始终有一个键。
示例:

type Unwrap<T> = T[keyof T];

type QueryReturn = Unwrap<GetProductQuery>;

Playground链接

57hvy0tb

57hvy0tb2#

我有点迟到了,但我看到你在使用graphql-codegen。我有一个类似的问题,我解决了:

type DataType = {
  __typename?: string;
};

type FilteredQuery<T> = {
  [P in keyof T as T[P] extends DataType ? P : never]: T[P];
};

type QueryData<T> = FilteredQuery<T>[keyof FilteredQuery<T>];

TypeScript playground示例。

xzlaal3s

xzlaal3s3#

我是否正确地理解了您只想获得中间没有getProduct别名的产品类型?
我有预感,这个额外的级别是因为你在别名你的查询。无论如何,在一个对象中没有第一个键。向下钻取的方法是指定键。这一切都可以通过像graphql-autogen这样的工具自动生成类型来变得容易得多。

相关问题