如何在GraphQL Nexus.js定义类型时扩展ObjectDefinitionBlock
你可以通过Nexus原生的blockExtension API 扩展ObjectDefinitionBlock实例的能力,无需新增自定义标量,完全基于原生ID标量封装即可实现需求。
实现步骤
- 全局注册
bigId扩展
import { blockExtension } from 'nexus' import type { ObjectDefinitionBlock } from 'nexus/dist/definitions/objectType' blockExtension('ObjectDefinitionBlock', { name: 'bigId', factory(t: ObjectDefinitionBlock<string>) { // 接收字段名和可选的配置项 return (fieldName: string, options: Record<string, any> = {}) => { return t.id(fieldName, { // 合并用户传入的配置 ...options, resolve(root, args, ctx, info) { // 优先走用户自定义的resolve逻辑,没有则直接取根对象上的对应字段 const rawId = options.resolve ? options.resolve(root, args, ctx, info) : root[fieldName] // 兼容空值场景 return rawId != null ? rawId.toString() : rawId } }) } } })
- 直接在类型定义中使用
export const Choice = objectType({ name: 'Choice', definition(t) { // 直接调用即可,无需额外写resolve t.bigId('id') // 也支持传入自定义配置,比如添加描述 // t.bigId('id', { description: '数据主键ID' }) t.string('value') t.int('order') } })
轻量替代方案
如果不想注册全局扩展,也可以封装独立工具函数实现:
import type { ObjectDefinitionBlock } from 'nexus' export function addBigId(t: ObjectDefinitionBlock<string>, fieldName: string, options: Record<string, any> = {}) { t.id(fieldName, { ...options, resolve: (root) => root[fieldName]?.toString() }) } // 使用方式 export const Choice = objectType({ name: 'Choice', definition(t) { addBigId(t, 'id') t.string('value') t.int('order') } })
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

