리스크립트 릴레이 PPX와 그래프큐엘 enum 타입

Page content

리스크립트 릴레이 PPX는 그래프큐엘 스키마를 파싱해서 리스크립트 타입을 자동으로 생성해주는데, 그래프큐엘의 enum 타입을 lower bound가 있는 폴리몰픽 배리언트로 타입을 생성해준다.

type enum_Weight = [> #KG | #G | #MG]

쿼리의 경우는 위와 같은데, 뮤테이션을 위한 인자로 사용될 경우 lower bound가 없는 폴리몰픽 배리언트를 사용해야만 하도록 타입을 생성해준다.

type weightInput = [#KG | #G | #MG]

뮤테이션의 인자로 사용될 경우 폴리몰픽 배리언트로 선언된 데이터 외에 다른 데이터를 허용하면 안되기 때문이라고 추측되는데, 이런 경우 쿼리를 통해 전달 받은 값을 뮤테이션 인자로 사용할 경우 타입이 달라서 구현을 할 때 번거로움이 있는 것 같다.

let product = Query.use()

let (weight, setWeight) = React.Uncurried.useState(_ => product.weight)

let input = Mutation.make_input(~weight=weight) // 에러

/*
This has type:
    Query_product_graphql.Types.enum_Weight
  Somewhere wanted: [#G | #KG | #MG]
*/

하지만, 타입 안정성 측면에서는 하나의 enum type에 대해서는 하나의 타입으로 명시하는 것이 올바르지 않을까.

반면에, 그래프큐엘 생태계는 enum type에 대해 향후 추가될 수 있는 것에 대한 처리가 일반적인 것 같다. 왜 일까?

관련자료

  • Flow 문서에서는 enum이 추가될 수 있으니 default 처리를 하라는 내용이 있음. 문서

    One use case for this would be the JS output of GraphQL Enums: Flow Enums with unknown members could be used instead of the added ‘%future added value’ member.

  • graphql_ppx의 경우 FutureAddedValue라는 옵션이 있다. 문서

  • rescript_relay_ppx 메인테이너와의 논의 https://github.com/zth/rescript-relay/issues/277