6

スキーマでクエリを定義するとき、以前に宣言された GraphQLEnumType の値を参照して、それを引数のデフォルト値として使用するにはどうすればよいですか?

ObservationPeriod次のGraphQLEnumTypeを定義したとしましょう:

observationPeriodEnum = new GraphQLEnumType {
  name: "ObservationPeriod"
  description: "One of the performance metrics observation periods"
  values:
    Daily:
      value: '1D'
      description: "Daily"
    […]
}

クエリ引数のタイプとして使用します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?
      […]
}

現在、実際の'1D'文字列値をデフォルト値として使用しています。これは機能します:

        period:
          type: observationPeriodEnum 
          defaultValue: '1D'

しかし、Daily代わりにシンボリック名を使用する方法はありますか? スキーマ自体で名前を使用する方法が見つかりませんでした。私が見落としているものはありますか?

列挙型が一連の定数としても動作し、スキーマ定義で次のように使用できることを期待していたので、私は尋ねています:

        period:
          type: observationPeriodEnum 
          defaultValue: observationPeriodEnum.Daily

単純な回避策:

##
# 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:
    […]

これにより、スキーマ定義で必要に応じて使用できます。

        period:
          type: observationPeriodEnum 
          defaultValue: observationPeriodEnum.Daily

nameもちろん、この修飾子は、enum 名が GraphQLEnumType の既存のメソッドおよび変数名 (現在は、description_values_enumConfig_valueLookup_nameLookupgetValues、および— 687 行付近のクラスの定義を参照serialize)parseValueに干渉しない限り、その約束を果たします_getValueLookuphttps://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L687で)_getNameLookuptoStringGraphQLEnumType

4

3 に答える 3

0

およびを返す列挙型にメソッドを追加するプル リクエストを見つけました。あなたの場合、この呼び出し:.getValue()namevalue

observationPeriodEnum.getValue('Daily');

戻ります:

{
  name: 'Daily',
  value: '1D'
}
于 2018-12-12T15:54:25.033 に答える