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

TypeScript中如何正确访问GetAudioQuery的audio_tags类型用于useState?

为React useState标注GraphQL Codegen生成类型的正确方式

场景说明

你有一段GraphQL Codegen生成的类型定义:

export type GetAudioQuery = { 
  audioByPk?: { 
    address: string, 
    id: any, 
    title?: string | null, 
    subtitle?: string | null, 
    audio_tags: Array<{ tagId: any }> 
  } | null 
};

尝试为React组件的state标注类型时,直接写useState<GetAudioQuery['audioByPk']['audio_tags']>([])会触发类型错误——因为audioByPk是可选属性且可能为null,TypeScript无法确保它存在,因此不能直接访问其audio_tags属性。

正确写法

方法一:用NonNullable排除空值后提取类型

const [currTags, setCurrTags] = useState<NonNullable<GetAudioQuery['audioByPk']>['audio_tags']>([]);

NonNullable<GetAudioQuery['audioByPk']>会排除audioByPk的null和undefined类型,确保后续访问的是有效的对象结构,再提取其audio_tags类型。

方法二:提前定义标签类型(更清晰)

先单独提取标签数组的元素类型,再定义state:

// 提取单个音频标签的类型
type AudioTag = NonNullable<GetAudioQuery['audioByPk']>['audio_tags'][number];
// 为state标注数组类型
const [currTags, setCurrTags] = useState<AudioTag[]>([]);

这种方式更易读,后续如果需要复用标签类型也更方便。

方法三:用条件类型推导

如果想通过类型推导直接获取audio_tags的类型,可以用条件类型:

const [currTags, setCurrTags] = useState<
  GetAudioQuery['audioByPk'] extends { audio_tags: infer T } ? T : never
>([]);

当audioByPk符合包含audio_tags的结构时,自动推导其类型,否则返回never。

内容的提问来源于stack exchange,提问作者randombits

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:35:45