deprecate other @obj by Freddy03h · Pull Request #825 · rescript-react-native/rescript-react-native

I deprecate some missing @obj on the project but I can't decide what to do with some of them.

Example with transform

type transform
@obj external perspective: (~perspective: float) => transform = ""
@obj external rotate: (~rotate: angle) => transform = ""
@obj external rotateX: (~rotateX: angle) => transform = ""
@obj external rotateY: (~rotateY: angle) => transform = ""
@obj external rotateZ: (~rotateZ: angle) => transform = ""
@obj external scale: (~scale: float) => transform = ""
@obj external scaleX: (~scaleX: float) => transform = ""
@obj external scaleY: (~scaleY: float) => transform = ""
@obj external translateX: (~translateX: size) => transform = ""
@obj external translateY: (~translateY: size) => transform = ""
@obj external skewX: (~skewX: angle) => transform = ""
@obj external skewY: (~skewY: angle) => transform = ""

In the react-native doc it's:

array of objects: {matrix: number[]}, {perspective: number},{rotate: string}, {rotateX: string}, {rotateY: string}, {rotateZ: string}, {scale: number}, {scaleX: number}, {scaleY: number}, {translateX: number}, {translateY: number}, {skewX: string}, {skewY: string} or string


We cannot type it with @unboxed so I only see two strategies:

  1. Record with optional fields
type transform = {
  rotate?: angle,
  scale?: float,
  translateX?: float,
  …
}

Pro: JS output is clean
Con: Can be error prone

  1. Variant
type transform2 =
  | Rotate({rotate: angle})
  | Scale({scale: float})
  | TranslateX({translateX: float})

Pro: Enforce type
Con: JS output an object with a TAG field (even if we can cutomize it with @tag)

What's your opinion on it @cknitt ?