如何在typescript中选择子类型(如果字段是可选的)



我在Typescript中有以下类型:

export type SomeQuery = {
__typename?: 'Query'
viewer?:
| {
__typename?: 'Viewer'
books?:
| {
__typename?: 'UserBooks'
total?: number | undefined | null
collection: Array<{+
__typename?: 'UserBook'
book?:
| {
__typename?: 'Book'

由于我有由graphql生成的查询类型,所以我想提取book的类型。我知道在TS中,你可以做一些类似的事情:

type Viewer = SomeQuery['viewer']

这是有效的,问题将进入下一个级别,因为viewer是可选的:

type MyBooks = Viewer['books']

我得到一个错误:

TS2339: Property 'books' does not exist on type '{ __typename?: "Viewer" | undefined; books?: { __typename?: "UserBooks" | undefined; total?: number | null | undefined; collection: { __typename?: "UserBook" | undefined; book?: { ...;

如果字段是可选的,我如何获取子类型?

PS:根据答案,我设法获得嵌套类型字段::

type Viewer = NonNullable<MyEventsQuery['viewer']>
type Books = NonNullable<Viewer['books']>
type Collection = NonNullable<Books['collection']>

现在问题出在Collection类型上,它是一个数组。我试过了:

export type MyBook = Collection['book']
export type MyBook = Collection[number]['book']

错误为:

TS2339: Property 'book' does not exist on type '{ __typename?: "UserBook" | undefined; book?: { __typename?: "Book" | undefined; ... | ... 1 | undefined; } | null | undefined; }[]'.

我认为问题是因为末尾的[],这表明这是UserBook的类型数组,但我不知道如何获取数组中的类型。

有人能告诉我应该在文档中使用什么,以便提取数组中的类型吗?

您可以在查找书籍之前将NonNullable实用程序应用于Viewer。

type MyBooks = NonNullable<Viewer>['books']

Q:有人能告诉我在文档中应该使用什么,以便提取数组中的类型吗?

A: 不知道文档中的位置。但是,您可以构建一个条件类型,该类型的最终值不是数组。

(基本上与NonNullable相同,后者最终会有一个不为null且未定义的条目。(

/**
* @description Returns the type of a given input. If the input was an array, it
* returns the returns the type inside the array. Non Recursive.
*
* @example type result = UnwrapArrayType<[1,2,3]>
* result here is of type number.
*
* @example type result = UnwrapArrayType<5>
* result here is of type number.
*/
export type UnwrapArrayType<T> = T extends (infer U)[] ? U : T

然后把它扔到你的收藏品里。

type UserBook = UnwrapArrayType<Collection>

会对你解决它的方法感兴趣,因为它已经有1个月的历史了。

问候

相关内容

  • 没有找到相关文章

最新更新