Quando si definisce una query in uno schema, come faccio a fare riferimento a un valore di GraphQLEnumType dichiarato in precedenza, per utilizzarlo come valore predefinito di un argomento?Come utilizzare i nomi in un oggetto GraphQLEnumType come valore predefinito di un argomento di query GraphQL?
Diciamo che ho definito seguente ObservationPeriod
GraphQLEnumType:
observationPeriodEnum = new GraphQLEnumType {
name: "ObservationPeriod"
description: "One of the performance metrics observation periods"
values:
Daily:
value: '1D'
description: "Daily"
[…]
}
e usarlo come il tipo di query argomento period
:
queryRootType = new GraphQLObjectType {
name: "QueryRoot"
description: "Query entry points to the DWH."
fields:
performance:
type: performanceType
description: "Given a portfolio EID, an observation period (defaults to YTD)
and as-of date, as well as the source performance engine,
return the matching performance metrics."
args:
period:
type: observationPeriodEnum
defaultValue: observationPeriodEnum.Daily ← how to achieve this?
[…]
}
Attualmente sto usando il valore effettivo '1D'
stringa come il valore predefinito; questo funziona:
period:
type: observationPeriodEnum
defaultValue: '1D'
Ma c'è un modo ho potuto utilizzare il nome simbolico Daily
invece? Non sono riuscito a trovare un modo per utilizzare i nomi all'interno dello schema stesso. C'è qualcosa che ho trascurato?
sto chiedendo, perché mi aspettavo un tipo enum a comportarsi come un insieme di costanti anche, e per essere in grado di usarli in questo modo nella definizione dello schema:
period:
type: observationPeriodEnum
defaultValue: observationPeriodEnum.Daily
Naïve soluzione:
##
# Given a GraphQLEnumType instance, this macro function injects the names
# of its enum values as keys the instance itself and returns the modified
# GraphQLEnumType instance.
#
modifiedWithNameKeys = (enumType) ->
for ev in enumType.getValues()
unless enumType[ ev.name]?
enumType[ ev.name] = ev.value
else
console.warn "SCHEMA> Enum name #{ev.name} conflicts with key of same
name on GraphQLEnumType object; it won't be injected for value lookup"
enumType
observationPeriodEnum = modifiedWithNameKeys new GraphQLEnumType {
name: "description: "Daily""
values:
[…]
che permette di utilizzarlo come desiderato nella definizione di schema:
period:
type: observationPeriodEnum
defaultValue: observationPeriodEnum.Daily
Naturalmente, questo modificatore fullfils sua promessa, solo fino a quando i nomi enum non interferiscono con GraphQLEnumType nomi dei metodi e variabili esistenti (che sono attualmente: name
, description
, _values
, _enumConfig
, _valueLookup
, _nameLookup
, getValues
, serialize
, parseValue
, _getValueLookup
, _getNameLookup
e toString
- vedere la definizione di GraphQLEnumType
classe attorno alla riga 687 in https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L687)
Ciao @Matthew Herbst, grazie per aver esaminato e condiviso la tua esperienza, che si riferisce a un valore letterale enumerato in una query GQL (ovvero, in "runtime"). La mia domanda riguardava comunque la * dichiarazione dello schema *: come accedere ad uno dei valori enumerati, usando un simbolo piuttosto che duplicare il valore letterale, mentre dichiari lo schema stesso? - che, in «schema design time», piuttosto che «query-time/runtime». – Olivier