Generating the most strict TS code possible (#4286)

* Eclipse ignore

* TypeScript support

* Prefixing enums

* Test results

* Merged JS and TS generators

* Fixed AppVeyor build problems

* Fixed more AppVeyor build problems

* Fixed more AppVeyor build problems

* Changed TS flag to options struct

* Storing options by value

* Removed unneeded const

* Re-export support for unions

* Uint support

* Casting bools to numbers for mutation

* TS shell tests

* Reverted generates js test file to original version

* Backing up js tests and properly generating test data

* Not importing flatbuffers for TS test generation

* Not overwriting generated js for tests

* AppVeyor test fixes

* Generating the most strict TS code possible
diff --git a/tests/TypeScriptTest.sh b/tests/TypeScriptTest.sh
index a5d44d5..54c6d08 100755
--- a/tests/TypeScriptTest.sh
+++ b/tests/TypeScriptTest.sh
@@ -18,6 +18,6 @@
 ../flatc --ts --no-fb-import --gen-mutable -o ts monster_test.fbs
 ../flatc -b monster_test.fbs unicode_test.json
 npm install @types/flatbuffers
-tsc ts/monster_test_generated.ts
+tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/monster_test_generated.ts
 npm uninstall @types/flatbuffers
 node JavaScriptTest ./ts/monster_test_generated
diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js
index 7b0165c..b49af0e 100644
--- a/tests/monster_test_generated.js
+++ b/tests/monster_test_generated.js
@@ -50,7 +50,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -101,7 +101,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -185,7 +185,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -267,7 +267,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -439,7 +439,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -522,7 +522,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -552,7 +552,7 @@
 
 /**
  * @param {flatbuffers.Encoding=} optionalEncoding
- * @returns {string|Uint8Array}
+ * @returns {string|Uint8Array|null}
  */
 MyGame.Example.Stat.prototype.id = function(optionalEncoding) {
   var offset = this.bb.__offset(this.bb_pos, 4);
@@ -654,7 +654,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -747,7 +747,7 @@
 
 /**
  * @param {flatbuffers.Encoding=} optionalEncoding
- * @returns {string|Uint8Array}
+ * @returns {string|Uint8Array|null}
  */
 MyGame.Example.Monster.prototype.name = function(optionalEncoding) {
   var offset = this.bb.__offset(this.bb_pos, 10);
diff --git a/tests/monster_test_generated.ts b/tests/monster_test_generated.ts
index 3ff1bf9..88bab89 100644
--- a/tests/monster_test_generated.ts
+++ b/tests/monster_test_generated.ts
@@ -29,7 +29,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -81,7 +81,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -166,7 +166,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -249,7 +249,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -422,7 +422,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -506,7 +506,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -534,10 +534,10 @@
 
 /**
  * @param {flatbuffers.Encoding=} optionalEncoding
- * @returns {string|Uint8Array}
+ * @returns {string|Uint8Array|null}
  */
-id():string
-id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array
+id():string|null
+id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
 id(optionalEncoding?:any):string|Uint8Array {
   var offset = this.bb.__offset(this.bb_pos, 4);
   return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
@@ -641,7 +641,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -732,10 +732,10 @@
 
 /**
  * @param {flatbuffers.Encoding=} optionalEncoding
- * @returns {string|Uint8Array}
+ * @returns {string|Uint8Array|null}
  */
-name():string
-name(optionalEncoding:flatbuffers.Encoding):string|Uint8Array
+name():string|null
+name(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
 name(optionalEncoding?:any):string|Uint8Array {
   var offset = this.bb.__offset(this.bb_pos, 10);
   return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
diff --git a/tests/namespace_test/namespace_test1_generated.js b/tests/namespace_test/namespace_test1_generated.js
index 7551a18..ab61534 100644
--- a/tests/namespace_test/namespace_test1_generated.js
+++ b/tests/namespace_test/namespace_test1_generated.js
@@ -28,7 +28,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -110,7 +110,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
diff --git a/tests/namespace_test/namespace_test1_generated.ts b/tests/namespace_test/namespace_test1_generated.ts
index 42a1a69..54d935a 100644
--- a/tests/namespace_test/namespace_test1_generated.ts
+++ b/tests/namespace_test/namespace_test1_generated.ts
@@ -18,7 +18,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -101,7 +101,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
diff --git a/tests/namespace_test/namespace_test2_generated.js b/tests/namespace_test/namespace_test2_generated.js
index c1c25ef..4c083ed 100644
--- a/tests/namespace_test/namespace_test2_generated.js
+++ b/tests/namespace_test/namespace_test2_generated.js
@@ -25,7 +25,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -141,7 +141,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
@@ -226,7 +226,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  this.bb = null;
+  this.bb = undefined;
 
   /**
    * @type {number}
diff --git a/tests/namespace_test/namespace_test2_generated.ts b/tests/namespace_test/namespace_test2_generated.ts
index d08366b..4d31bd1 100644
--- a/tests/namespace_test/namespace_test2_generated.ts
+++ b/tests/namespace_test/namespace_test2_generated.ts
@@ -9,7 +9,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -126,7 +126,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}
@@ -212,7 +212,7 @@
   /**
    * @type {flatbuffers.ByteBuffer}
    */
-  bb: flatbuffers.ByteBuffer= null;
+  bb: flatbuffers.ByteBuffer;
 
   /**
    * @type {number}