From f25e60af655dcdd0a897d6c83fd1b65eecd713ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guillaume=20Perr=C3=A9al?= <guillaume.perreal@inrae.fr>
Date: Thu, 2 Apr 2020 15:58:32 +0200
Subject: [PATCH] =?UTF-8?q?Am=C3=A9liore=20les=20type-checks=20et=20casts?=
 =?UTF-8?q?=20des=20types=20"built-ins".?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Notamment pour true, false, undefined et null qui sont des singletons.
---
 src/php/Models/Types/BuiltinType.php | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/php/Models/Types/BuiltinType.php b/src/php/Models/Types/BuiltinType.php
index 1474da9..52872ee 100644
--- a/src/php/Models/Types/BuiltinType.php
+++ b/src/php/Models/Types/BuiltinType.php
@@ -52,15 +52,16 @@ class BuiltinType extends AbstractType
             case 'number':
             case 'boolean':
                 return sprintf('%s.toString()', $expr);
+            case 'null':
+            case 'undefined':
             case 'true':
             case 'false':
                 return sprintf('"%s"', $this->name);
             case 'Date':
                 return sprintf('%s.toISOString()', $expr);
-            case 'undefined':
-            case 'null':
             case 'never':
-                return '';
+            case 'unknown':
+                return sprintf('"" /* %s */', $this->name);
             default:
                 return sprintf('JSON.stringify(%s)', $expr);
         }
@@ -71,6 +72,19 @@ class BuiltinType extends AbstractType
      */
     public function checkType(string $expr, bool $explicit = false): string
     {
-        return sprintf('(typeof %s === %s)', $expr, TypescriptHelper::quoteString($this->name));
+        switch ($this->name) {
+            case 'null':
+            case 'true':
+            case 'false':
+            case 'undefined':
+                return sprintf('(%s === %s)', $expr, $this->name);
+            case 'unknown':
+            case 'any':
+                return 'true';
+            case 'Date':
+                return sprintf('(%s instanceof %s)', $expr, $this->name);
+            default:
+                return sprintf('(typeof %s === %s)', $expr, TypescriptHelper::quoteString($this->name));
+        }
     }
 }
-- 
GitLab