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

