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

TypeScript中如何声明兼具const断言与Prisma.UserSelect类型的常量对象

如何在Prisma中同时获得可复用选择对象的类型提示与精确类型推断?

在使用Prisma时,内联编写select参数能获得完整的智能提示,且Prisma能精确推断查询返回类型。但当我们想提取可复用的选择对象时,会遇到两难:

  • 用as const断言能保留精确字面量类型,让Prisma正确推断返回类型,但编写时没有Prisma.UserSelect的智能提示;
  • 直接标注类型Prisma.UserSelect能获得提示,但会丢失具体属性的精确类型,导致Prisma无法推断出准确的返回结构。

解决方案

方法1:使用TypeScript 4.9+的satisfies关键字(最优解)

satisfies关键字可以检查对象是否符合目标类型,但不会改变TypeScript对对象的原始类型推断,完美兼顾智能提示与精确类型:

export const DefaultUserSelection = {
  name: true,
  email: true,
} satisfies Prisma.UserSelect;

编写这个对象时,VS Code会提供UserSelect的属性智能提示;同时TypeScript会保留对象的精确字面量类型,Prisma依然能准确推断查询的返回类型。

方法2:兼容旧版TypeScript的手动类型约束

如果你的TypeScript版本低于4.9,可以先定义一个包含目标属性的精确类型,再结合const断言:

// 先定义仅包含需要属性的类型
type DefaultUserSelectionType = Pick<Prisma.UserSelect, 'name' | 'email'>;

// 用satisfies做类型校验(TS 4.7+支持)
export const DefaultUserSelection = {
  name: true,
  email: true,
} as const satisfies DefaultUserSelectionType;

// 或者直接双重断言
export const DefaultUserSelection = {
  name: true,
  email: true,
} as const as DefaultUserSelectionType;

这种方法需要手动维护属性列表,不如satisfies便捷,但能在旧版TS中实现需求。

为什么之前的尝试无效?

  • as Prisma.UserSelect会将对象类型拓宽为UserSelect,丢失了具体选中属性的精确信息,导致Prisma无法推断返回类型;
  • as const仅保留字面量类型,但没有类型约束,编写时无法获得UserSelect的智能提示;
  • 双重断言as Prisma.UserSelect as const无效,因为const断言只能应用于字面量对象,不能用于已被拓宽的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:15:42