在Type-graphql与Typeorm实体中外键用ID标量类型语义是否正确
结论:你应该将userId字段的GraphQL类型声明为ID类型,你示例代码中标注的@Field(type => ID)写法是完全正确的,不需要改成String。
核心原因如下:
- 完全符合ID类型的语义定义
GraphQL的ID类型的核心作用是标识「任意实体的唯一标识符」,并非只能用于当前实体的主键。userId存储的是关联User实体的主键,本身就属于唯一标识符范畴,不是普通的业务文本字符串(比如文章标题、用户昵称这类需要人类可读的内容),用ID类型更贴合字段的实际用途,也能和User实体的id字段类型保持统一,避免出现类型不匹配的问题。 - 适配GraphQL生态的默认行为
主流的GraphQL客户端、代码生成工具都会对ID类型的字段做特殊适配:比如缓存关联数据、自动生成类型定义时都会把标识符类字段归为一类统一处理。如果把userId声明为String类型,反而会增加额外的类型适配成本,甚至可能出现查询时参数类型不匹配的问题。 - 不需要被「仅当前实体主键用ID」的误区限制
很多人误以为只有当前实体的主键(比如示例中Article的id字段)才能用ID类型,这是对ID类型的误解。只要字段存储的是某个实体的唯一标识,不管是当前实体的还是关联实体的,都适合用ID类型。
只有一种特殊情况你可以考虑用String:如果你的业务场景里需要把userId作为普通字符串做拼接、截断、展示给普通用户等操作,不过这种场景在实际业务中非常少见,因为用户ID本身就不需要面向普通用户可读。
内容的提问来源于stack exchange,提问作者RedGiant
相关产品推荐
相关产品推荐

