Soy un poco nuevo en mecanografiado y tuve esto varias veces. Uso, por ejemplo, prisma (o cualquier cosa) para obtener un valor cuyo tipo es monstruosamente complejo (como en long).
Tiene muchos atributos y esos están perfectamente bien. Tan pronto como quiero definir una función para manejar este valor, pierdo toda la información de tipo ya que tendría que redefinir este tipo complejo en el parámetro.
Ejemplo:
const users = await prisma.user.findMany({ select:{ projects: { select: { name: true, slug: true, _count:{ select: { subscribers: true, mediaIds: true } } }, }, id: true, email: true, firstName: true, lastName: true, createdAt: true, _count:{ select:{ mediaIds: true, projects: true } } }, });Y ahora quiero definir una función para, por ejemplo, manejar uno solo de esos suscriptores:
users.forEach(user=>{ // here I have perfect typing for the user object handleUser(user) }); function handleUser(user: <what to put here?>){ // here I'd have to retype / redefine the monstreously long (but helpful) dynamic type that prisma creates for my query }Estoy confundido sobre cuál es el enfoque común aquí.
Si la matriz de users está disponible en el ámbito de la función, puede usar el operador typeof .
function handleUser(user: typeof users[number]){ } Puede indexar el tipo de typeof users con el number para obtener el tipo de un elemento de matriz dentro de users .
Puede usar la clase que define el modelo User . Usted define el modelo una vez en el archivo orm y luego puede usar el tipo de User para escribir sus parámetros. Typescript no puede saber que el usuario param es un usuario, por lo que debe escribirlo
function handleUser(user: User){ // handle the user }Para definir un tipo grande en TypeScript, use la interface para objetos o type para detalles pequeños.
Ejemplo:
interface HumanType { name: string; age: number; } const human: HumanType = { name: "Thomas", age: 34588 }En este ejemplo, si tiene una clase que define a Human, utilícela como tipo.