You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GraphQL Nexus.js定义类型时扩展ObjectDefinitionBlock

你可以通过Nexus原生的blockExtension API 扩展ObjectDefinitionBlock实例的能力,无需新增自定义标量,完全基于原生ID标量封装即可实现需求。

实现步骤

  1. 全局注册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
        }
      })
    }
  }
})
  1. 直接在类型定义中使用
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:15:03