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:
- Record with optional fields
type transform = { rotate?: angle, scale?: float, translateX?: float, … }
Pro: JS output is clean
Con: Can be error prone
- 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 ?