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

如何在Sanity中基于对象数组动态创建Desk结构?

在Sanity中基于对象数组动态创建Desk结构的解决方法

错误原因

你当前的代码直接返回了days.map()生成的列表项数组,但Sanity的Structure Builder要求根结构必须是单个结构对象(如S.list()实例),而非数组,这就是报错的核心原因。

解决方案

调整结构构建逻辑,用S.list()创建根列表容器,再通过.items()方法传入动态生成的列表项数组。同时修正泛型类型匹配返回值类型。

修改后的Desk文件代码

import {ListBuilder} from 'sanity/structure'
import defineStructure from '../utils/defineStructure'

const days = [
  {
    id: '0',
    title: 'Monday',
    schemaType: 'mon',
    icon: '',
  },
  {
    id: '4',
    title: 'Thursday',
    schemaType: 'thurs',
    icon: '',
  },
  {
    id: '5',
    title: 'Friday',
    schemaType: 'fri',
    icon: '',
  },
]

export default defineStructure<ListBuilder>((S, context) => {
  return S.list()
    .title('工作日') // 可自定义根列表标题
    .items(days.map(d => 
      S.listItem()
        .id(d.id)
        .title(d.title)
        .icon(d.icon ? () => d.icon : undefined) // 兼容空icon场景
        .schemaType(d.schemaType)
    ))
})

关键调整点

  • 根结构容器:用S.list()创建根列表,替代直接返回数组
  • 子项传入:通过.items()方法将动态生成的listItem数组传入根列表
  • 泛型修正:将泛型从ListItemBuilder改为ListBuilder,匹配返回的根列表类型
  • icon兼容:处理空icon值,避免无效组件渲染

其他文件(defineStructure.ts和sanity.config.ts)无需修改,保持原代码即可。

内容的提问来源于stack exchange,提问作者GʀᴜᴍᴘʏCᴀᴛ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:12:27