GraphQL 是一种强类型的查询语言,它允许客户端按需查询数据,并减少不必要的数据传输,提高了通信效率。对于前端开发人员而言,了解 GraphQL 的类型定义是非常必要的。不过,当我们涉及到多个类型定义时,就需要注意一些问题了。本文将会介绍 GraphQL 多个类型定义的一些注意点,包括枚举类型、接口类型、联合类型以及输入对象类型。
枚举类型定义
枚举类型定义可以看作是一个可枚举的常量集合。定义一个枚举类型非常简单,我们只需在类型定义语句中使用 enum
关键字,然后在枚举值之间使用逗号进行分隔。
enum Gender { MALE FEMALE UNKNOWN }
在使用枚举类型的时候,我们可以直接引用枚举值,例如:
type UserInfo { id: ID! name: String! gender: Gender! }
需要注意的是,服务器需要对每个请求进行有效性检查,确保查询中使用的枚举值都是有效的。
接口类型定义
接口类型定义是指某个类型必须实现指定接口中规定的字段和类型,否则会报错。定义接口类型时,我们使用 interface
关键字。
interface Node { id: ID! } type User implements Node { id: ID! userName: String! }
在上面的例子中,我们定义了一个接口类型 Node
,其包含一个必须的 id
字段。接着,我们定义了一个 User
类型,并表示 User
类型必须实现 Node
接口中定义的 id
字段。
需要注意的是,如果查询 User
并且需要返回 Node
,则需要用 ... on
语句进行类型转换。
query { getUser(id: "1") { ... on Node { id } userName } }
联合类型定义
联合类型定义表示某个类型可以是多个类型中的任何一个,例如:
union SearchResult = User | Article
上面的定义表示 SearchResult
可以为 User
或 Article
中的一个类型。在查询时,我们可以通过 __typename
域来区分返回的具体类型。
// javascriptcn.com 代码示例 query { search(queryString: "GraphQL") { __typename ... on User { userName } ... on Article { title } } }
需要注意的是,如果查询联合类型,必须返回具体类型中的全部字段数据,并且使用 __typename
转换查询结果来作为查看类型的关键。
输入类型定义
输入对象类型定义是指当我们需要传递一些参数到我们的查询或者变异中时,我们可以定义一个输入对象类型。需要注意的是,输入对象类型只能用于变异或者查询参数中。一个输入对象类型是一个字段名称/值对的列表。
input UserInput { userName: String! password: String! email: String! age: Int! }
在上面的例子中,我们定义了一个输入对象类型 UserInput
,该类型有 userName
、password
、email
、age
以及其他必需的字段,分别用于输入用户信息。
当我们需要在一个查询或者变异中传入多个参数,我们只需要在字段中添加参数即可,例如:
mutation createUser($userInput: UserInput!) { createUser(input: $userInput) { id userName email } }
上面的例子表示,我们需要传入一个 userInput
变量,并用来创建一个用户。我们只需要在变异中设置这些值,然后将 userInput
对象传递给 createUser
变异函数就可以了。
总结
在 GraphQL 中,多个类型定义很常见。本文介绍了 GraphQL 中枚举类型定义、接口类型定义、联合类型定义以及输入对象类型定义的注意事项,希望对你有所帮助。参考本文中的示例代码,帮助你更好地掌握这些类型定义。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654f10fa7d4982a6eb818482