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

TypeScript中如何正确为let skills指定PlayerByIdQuery关联类型?

问题原因与解决方案

为什么报错?

原类型定义里,playerById是可选且可能为null的类型({...} | null | undefined)。TypeScript不允许直接在可能为null/undefined的值上访问属性,所以你直接写PlayerByIdQuery["playerById"]["skills"]时,TypeScript无法确定playerById一定存在,自然找不到skills属性。

你移除| null和?后,playerById变成了必选且非null的类型,TypeScript能确定它有skills属性,所以报错消失,但这种修改生成的类型定义的做法并不合理——因为实际查询中可能找不到对应的Player,返回null,强行移除null选项会导致类型和实际运行情况不符。

正确的类型指定方式

不需要修改生成的类型,用TypeScript内置的NonNullable工具类型先排除playerById的null/undefined情况,再获取skills的类型:

import type { PlayerByIdQuery } from "generated/queries";

// 先确保playerById非null/undefined,再取skills的类型
let skills: NonNullable<PlayerByIdQuery["playerById"]>["skills"];

如果需要保留playerById可能为null的场景(即skills也可能是undefined/null),可以直接用条件类型推导:

let skills: PlayerByIdQuery["playerById"] extends { skills: infer S } ? S : undefined;

或者用更清晰的类型别名拆分:

type Player = NonNullable<PlayerByIdQuery["playerById"]>;
let skills: Player["skills"];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:25:13