// Reading discriminating union requires using JSValue.
        public static void ReadValue(this JSValue jsValue, out OneOf2 <T2Extra, R2D2Extra> value)
        {
            value = default;
            if (jsValue.TryGetObjectProperty("Kind", out JSValue kind))
            {
                RobotModel modelType = kind.ReadValue <RobotModel>();
                switch (modelType)
                {
                case RobotModel.T2: value = jsValue.ReadValue <T2Extra>(); break;

                case RobotModel.R2D2: value = jsValue.ReadValue <R2D2Extra>(); break;
                }
            }
        }
 // Writing discriminating union is simpler than reading.
 public static void WriteValue(this IJSValueWriter writer, OneOf2 <T2Extra, R2D2Extra> value)
 {
     writer.WriteObjectBegin();
     if (value.TryGet(out T2Extra t2))
     {
         writer.WriteObjectProperty("Kind", RobotModel.T2);
         writer.WriteObjectProperties(t2);
     }
     else if (value.TryGet(out R2D2Extra r2d2))
     {
         writer.WriteObjectProperty("Kind", RobotModel.R2D2);
         writer.WriteObjectProperties(r2d2);
     }
     writer.WriteObjectEnd();
 }