WebStorm中Prisma CRUD查询报SelectSubSet类型不兼容警告
WebStorm中Prisma CRUD查询出现SelectSubSet类型不兼容警告,VSCode中无此问题
问题描述
用Next.js + Prisma开发项目时,在JetBrains WebStorm IDE里,大部分Prisma CRUD查询都会弹出警告:Argument type .. is not assignable to parameter type SelectSubSet,但切换到VSCode打开项目时,该警告完全消失。
警告示例:
编辑器内显示红色警告:
Argument type '{ start_date: string; end_date: string; number_of_guests: number; price: number; venue: { connect: { id: string; }; }; customer: { connect: { id: string; }; }; }' is not assignable to parameter type 'SelectSubSet<BookingCreateInput, BookingCreateInput>'
相关代码信息
传入create函数的bookingInput
bookingInput { start_date: '2023-11-10T15:05:52.541Z', end_date: '2023-11-10T19:05:52.541Z', number_of_guests: 2, price: 240, venue: { connect: { id: 'venue-0' } }, customer: { connect: { id: 'user-41' } } }
对应的BookingCreateInput类型定义
export type BookingCreateInput = { id?: string booking_date?: Date | string start_date: Date | string end_date: Date | string number_of_guests: number host_notes?: string | null price?: Decimal | DecimalJsLike | number | string | null paid?: boolean venue?: VenueCreateNestedOneWithoutBookingsInput customer?: UserCreateNestedOneWithoutBookingsInput }
Prisma Schema定义
generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model User { id String @id @db.VarChar(36) @default(uuid()) email String password String first_name String last_name String role USER_ROLE @default(CUSTOMER) bookings Booking[] ratings Rating[] venues Venue[] @@map("users") } model Venue { id String @id @db.VarChar(36) @default(uuid()) name String @db.VarChar(50) description String @db.MediumText capacity Int surface_area Decimal @db.Decimal(4, 0) hourly_price Decimal @db.Decimal(5, 0) opening_time DateTime @db.Time(4) closing_time DateTime @db.Time(4) status VENUE_STATUS @default(PENDING) is_featured Boolean? @default(false) location_street String location_number String location_city String location_zip_code String location_state_province String location_country String location_lat Decimal @default(0) location_lng Decimal @default(0) bookings Booking[] ratings Rating[] activities Activity[] facilities Facility[] styles Style[] host_id String? @db.VarChar(36) host User? @relation(fields: [host_id], references: [id], onUpdate: NoAction) @@map("venues") } model Style { id Int @id @default(autoincrement()) name String venues Venue[] @@map("styles") } model Facility { id Int @id @default(autoincrement()) name String venues Venue[] @@map("facilities") } model Activity { id Int @id @default(autoincrement()) name String venues Venue[] @@map("activities") } model Booking { id String @id @db.VarChar(36) @default(uuid()) booking_date DateTime @default(now()) start_date DateTime end_date DateTime number_of_guests Int host_notes String? price Decimal? @db.Decimal(4, 0) paid Boolean @default(false) venue_id String? @db.VarChar(36) customer_id String? @db.VarChar(36) venue Venue? @relation(fields: [venue_id], references: [id], onUpdate: NoAction) customer User? @relation(fields: [customer_id], references: [id], onUpdate: NoAction) @@map("bookings") } model Rating { id String @id @db.VarChar(36) @default(uuid()) rating Int review String? would_recommend Boolean reviewer_id String? @db.VarChar(36) venue_id String? @db.VarChar(36) user User? @relation(fields: [reviewer_id], references: [id], onDelete: Cascade, onUpdate: NoAction) venue Venue? @relation(fields: [venue_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@map("ratings") } enum USER_ROLE { ADMIN CUSTOMER HOST } enum VENUE_STATUS { PENDING APPROVED DECLINED }
解决方法
- 更新WebStorm及插件:确保WebStorm和Prisma插件都是最新版本,新版本会修复TypeScript类型推断的兼容性问题。
- 重新生成Prisma Client:执行
npx prisma generate,重新生成类型定义文件,避免缓存或损坏导致的异常。 - 调整TypeScript设置:打开WebStorm设置(
File > Settings),进入Languages & Frameworks > TypeScript,将TypeScript版本设为项目本地安装的版本,并勾选Use TypeScript service选项。 - 清除IDE缓存:执行
File > Invalidate Caches...,选择清除缓存并重启WebStorm,解决缓存引发的类型识别错误。 - 显式指定类型:如果以上方法无效,给参数添加显式类型注解,示例:
import { BookingCreateInput } from '@prisma/client'; const bookingInput: BookingCreateInput = { start_date: '2023-11-10T15:05:52.541Z', end_date: '2023-11-10T19:05:52.541Z', number_of_guests: 2, price: 240, venue: { connect: { id: 'venue-0' } }, customer: { connect: { id: 'user-41' } } }; await prisma.booking.create({ data: bookingInput });
内容的提问来源于stack exchange,提问作者DanteC
相关产品推荐
相关产品推荐

