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 enviarse accidentalmente en una respuesta, lo que podría exponer datos confidenciales.
Estoy creando mi aplicación usando Prisma para conectarme a la base de datos (aplicación Next.js). Tengo algunos problemas con las definiciones de mecanografiado generadas automáticamente.
Estoy siguiendo los documentos pero no sé 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> Imagine que Post es el siguiente (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 de createdAt Post Básicamente, el tipo 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?
Encontré una solución: en lugar de usar include use select con una select anidada para posts . El problema es que se vuelve bastante detallado y engorroso de mantener (cada vez que se agrega un campo en el esquema, también se debe agregar aquí...)
const userWithPosts = Prisma.validator<Prisma.UserArgs>()({ select: { email: true, name: true, posts: { select: { id: true, title: true, published: true, authorId: true } } } })