我在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个月的历史了。
问候