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
相关产品推荐
相关产品推荐

