Búsqueda de sitios web

javascript - Prisma: cómo excluir propiedades de los tipos generados


EDITAR hay un peligro oculto al ocultar campos en las definiciones de TS: los campos no serán accesibles durante el desarrollo con intellisense, pero el objeto completo con campos "ocultos" puede ser enviado accidentalmente en una respuesta, exponiendo potencialmente datos sensibles.

Estoy construyendo mi aplicación usando Prisma para conectarme a la base de datos (aplicación Next.js). Estoy teniendo algunos problemas con las definiciones de Typescript generadas automáticamente.

Estoy siguiendo la documentación pero no puedo entender cómo seleccionar un subconjunto de campos de Post. En su ejemplo:

import { Prisma } from '@prisma/client'

const userWithPosts = Prisma.validator<Prisma.UserArgs>()({
  include: { posts: true }, // -> how can I exclude some fields from the Post type?
})

type UserWithPosts = Prisma.UserGetPayload<typeof userWithPosts>

Imagina que Post sea como sigue (simplificado):

model Post {
  id         Int        @id @default(autoincrement())
  createdAt  DateTime   @default(now())
  title      String
  published  Boolean    @default(false)
  author     User       @relation(fields: [authorId], references: [id])
  authorId   Int
}

Me gustaría excluir algunos de los campos generados automáticamente del tipo Post, por ejemplo createdAt. Básicamente, el tipo de user.posts[0] tendrá todos los campos excepto createdAt.

Una solución podría ser:

const postData = Prisma.validator<Prisma.PostArgs>()({
  select: { id: true, title: true, published: true, authorId: true }
})

type UserWithPosts = Omit<Prisma.UserGetPayload<typeof userWithPosts>, 'posts'> & {
  posts: postData[]
}

Pero esperaba algo un poco más limpio. ¿Alguna alternativa?

Respuesta #1

Encontré una solución: en lugar de usar include, utiliza select con un select anidado para posts. El problema es que se vuelve bastante verboso y engorroso de mantener (cada vez que se agrega un campo en el esquema debe agregarse aquí también...)

const userWithPosts = Prisma.validator<Prisma.UserArgs>()({
  select: {
    email: true,
    name: true,
    posts: {
      select: {
        id: true,
        title: true,
        published: true,
        authorId: true
      }
    }
  }
})