Spesifikasyondan:
GraphQL Nesne türü (ObjectTypeDefinition) ... yeniden kullanım için uygun değildir [girdi olarak], çünkü Nesne türleri bağımsız değişkenleri tanımlayan veya arabirimlere ve birleşimlere referanslar içeren alanlar içerebilir, bunların hiçbiri girdi bağımsız değişkeni olarak kullanılmaya uygun değildir . Bu nedenle, giriş nesnelerinin sistemde ayrı bir türü vardır.
"Resmi neden" budur, ancak bir nesne türünü girdi nesnesi türü olarak veya bir nesne türünü girdi nesnesi türü olarak kullanamamanın birkaç pratik nedeni vardır:
İşlevsellik
Nesne türlerinin ve girdi nesnesi türlerinin her ikisinin de alanları vardır, ancak bu alanlar, bu türlerin şema tarafından nasıl kullanıldığını yansıtan farklı özelliklere sahiptir. Şemanız, bir nesne türünün alanları için potansiyel olarak argümanları ve bir tür çözümleyici işlevi tanımlayacaktır, ancak bu özellikler bir girdi bağlamında anlam ifade etmez (yani bir girdi nesnesinin alanını çözemezsiniz - zaten açık bir değere sahiptir) . Benzer şekilde, varsayılan değerler yalnızca girdi nesne türü alanları için sağlanabilir ve nesne türü alanları için sağlanamaz.
Başka bir deyişle, bu kopya gibi görünebilir:
type Student {
name: String
grade: Grade
}
input StudentInput {
name: String
grade: Grade
}
Ancak nesne türlerine veya girdi nesnesi türlerine özgü özellikler eklemek, bunların farklı davrandıklarını netleştirir:
type Student {
name(preferred: Boolean): String
grade: Grade
}
input StudentInput {
name: String
grade: Grade = F
}
Tür sistem sınırlamaları
GraphQL'deki türler, çıktı türleri ve girdi türleri olarak gruplandırılır .
Çıktı türleri, bir GraphQL hizmeti tarafından üretilen bir yanıtın parçası olarak döndürülebilen türlerdir. Giriş türleri, alan veya yönerge bağımsız değişkenleri için geçerli girdiler olan türlerdir.
Bu iki grup arasında örtüşme vardır (yani skalarlar, numaralandırmalar, listeler ve boş olmayanlar). Ancak, birleşimler ve arabirimler gibi soyut türler bir girdi bağlamında anlam ifade etmez ve girdi olarak kullanılamaz. Nesne türlerini ve girdi nesnesi türlerini ayırmak, bir giriş türünün beklendiği durumlarda soyut bir türün asla kullanılmamasını sağlamanıza olanak tanır.
Şema tasarımı
Şemanızda bir varlığı temsil ederken, bazı varlıkların gerçekten de ilgili girdi ve çıktı türleri arasında "alanları paylaşması" muhtemeldir:
type Student {
firstName: String
lastName: String
grade: Grade
}
input StudentInput {
firstName: String
lastName: String
grade: Grade
}
Bununla birlikte, nesne türleri çok karmaşık veri yapılarını modelleyebilir (ve gerçekte sıklıkla yapar):
type Student {
fullName: String!
classes: [Class!]!
address: Address!
emergencyContact: Contact
# etc
}
Bu yapılar iken edebilir uygun girişler çevirmek genellikle onlar değil, (biz de onların adresini temsil eden bir nesne geçer yüzden, bir Öğrenci oluşturma) - yani belki sınıf kimliği ve bölüm kimliği değil, bir tarafından öğrencinin derslere belirtmeniz gerekir nesne. Benzer şekilde, geri dönmek istediğimiz, ancak mutasyona uğramak istemediğimiz veya tam tersi (bir password
alan gibi ) alanlarımız olabilir.
Dahası, nispeten basit varlıklar için bile, nesne türleri ve bunların "karşılık gelen" girdi nesneleri arasındaki boş değer atanabilirlik konusunda genellikle farklı gereksinimlere sahibiz. Genellikle bir alanın yanıtta da döndürüleceğini garanti etmek isteriz, ancak girdimizde aynı alanları zorunlu kılmak istemiyoruz. Örneğin,
type Student {
firstName: String!
lastName: String!
}
input StudentInput {
firstName: String
lastName: String
}
Son olarak, birçok şemada, belirli bir varlık için nesne türü ile giriş nesnesi türü arasında genellikle bire bir eşleştirme yoktur. Yaygın bir model, şema düzeyinde giriş doğrulamasını daha da ince ayarlamak için farklı işlemler için ayrı giriş nesnesi türlerini kullanmaktır:
input CreateUserInput {
firstName: String!
lastName: String!
email: String!
password: String!
}
input UpdateUserInput {
email: String
password: String
}
Bu örneklerin tümü önemli bir noktayı göstermektedir - bir girdi nesnesi türü bazen bir nesne türünü yansıtabilirken, iş gereksinimleri nedeniyle bunu üretim şemalarında görme olasılığınız çok daha düşüktür.