TypeScript GraphQL per MongoDB — Numio
Genera tipi di documenti TypeScript MongoDB da uno schema annotato con @entity, @id, @column, @link, @embedded e @map, utilizzando @graphql-codegen/typescript-mongodb. Ogni tipo di entità @ ottiene un tipo <Name>DbObject; i campi senza direttiva vengono omessi.
Mantenere la forma del documento MongoDB memorizzata digitata insieme ai tipi GraphQL API della stessa entità.
Quando usarlo
- Mantenere la forma del documento MongoDB memorizzata digitata insieme ai tipi GraphQL API della stessa entità.
- Osservare come i percorsi @map e i riferimenti @link si traducono in oggetti nidificati e array ObjectId prima di scrivere il codice di accesso ai dati.
Come si usa
- Incolla uno schema i cui tipi utilizzano @entity e i cui campi utilizzano @id, @column, @link, @embedded o @map(path: ...).
- Leggi i tipi DbObject verso la fine dell'output; i tipi GraphQL stessi vengono generati sopra di essi.
- Copia il risultato in un file .ts; importa ObjectId dal pacchetto mongodb.
Schema GraphQL con direttive MongoDB
type User @entity {
id: ID! @id
email: String! @column @map(path: "login.email")
profile: Profile! @embedded
posts: [Post!]! @link
}
type Profile @entity(embedded: true) {
name: String! @column
}
type Post @entity {
id: ID! @id
title: String! @column
}Tipi TypeScript DbObject
…
export type AdditionalEntityFields = {
path?: InputMaybe<Scalars["String"]["input"]>
type?: InputMaybe<Scalars["String"]["input"]>
}
import { ObjectId } from "mongodb"
export type UserDbObject = {
_id: ObjectId
login: {
email: string
}
profile: ProfileDbObject
posts: Array<PostDbObject["_id"]>
}
export type ProfileDbObject = {
name: string
}
export type PostDbObject = {
_id: ObjectId
title: string
}Dettagli e limiti
@id diventa _id: ObjectId, @link diventa _id dell'entità collegata (Array<PostDbObject["_id"]> per elenchi) e @map(percorso: "login.email") crea un oggetto login nidificato.
I campi senza direttiva (nessuna @column, @id, @link, @embedded) non sono inclusi nel tipo DbObject; le colonne nullable diventano proprietà Maybe<T> opzionali.
L'output contiene anche i tipi standard di plugin dattiloscritto (eliminati sopra). La generazione viene eseguita in un Web Worker nel tuo browser.
FAQ
Devo dichiarare le direttive @entity e @column nel mio schema?
No. Il plugin aggiunge le proprie definizioni di direttiva, motivo per cui nell'output appare anche il tipo di input AdditionalEntityFields.
Come vengono digitati i documenti incorporati?
Un tipo dichiarato con @entity(embedded: true) ottiene un tipo DbObject senza _id e un campo contrassegnato con @embedded fa riferimento ad esso, ad esempio profile: ProfileDbObject.
Perché manca un campo nel tipo DbObject?
Solo i campi con @id, @column, @link, @embedded o @map sono campi memorizzati. Aggiungi @colonna per includere un campo semplice.