diff --git a/tests/JavaScriptUnionVectorTest.js b/tests/JavaScriptUnionVectorTest.js
index d79669f..f03a327 100644
--- a/tests/JavaScriptUnionVectorTest.js
+++ b/tests/JavaScriptUnionVectorTest.js
@@ -3,38 +3,16 @@
 var flatbuffers = require('../js/flatbuffers').flatbuffers;
 var Test = require(process.argv[2]);
 
-function main() {
-  var fbb = new flatbuffers.Builder();
+var isTsTest = !!process.env.FB_TS_TEST; 
 
-  var charTypes = [
-    Test.Character.Belle,
-    Test.Character.MuLan,
-    Test.Character.BookFan,
-  ];
+var charTypes = [
+  Test.Character.Belle,
+  Test.Character.MuLan,
+  Test.Character.BookFan,
+];
+if(isTsTest) { charTypes.push(Test.Character.Other); }
 
-  Test.Attacker.startAttacker(fbb);
-  Test.Attacker.addSwordAttackDamage(fbb, 5);
-  var attackerOffset = Test.Attacker.endAttacker(fbb);
-
-  var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
-  var charsOffset = Test.Movie.createCharactersVector(
-    fbb,
-    [
-      Test.BookReader.createBookReader(fbb, 7),
-      attackerOffset,
-      Test.BookReader.createBookReader(fbb, 2),
-    ]
-  );
-
-  Test.Movie.startMovie(fbb);
-  Test.Movie.addCharactersType(fbb, charTypesOffset);
-  Test.Movie.addCharacters(fbb, charsOffset);
-  Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb));
-
-  var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
-
-  var movie = Test.Movie.getRootAsMovie(buf);
-
+function testMovieBuf(movie) {
   assert.strictEqual(movie.charactersTypeLength(), charTypes.length);
   assert.strictEqual(movie.charactersLength(), movie.charactersTypeLength());
 
@@ -51,6 +29,98 @@
   var bookReader2 = movie.characters(2, new Test.BookReader());
   assert.strictEqual(bookReader2.booksRead(), 2);
 
+  if(isTsTest) {
+    var other = movie.characters(3, '');
+    assert.strictEqual(other, "I am other");
+  }
+}
+
+function testMovieUnpack(movie) {
+  assert.strictEqual(movie.charactersType.length, charTypes.length);
+  assert.strictEqual(movie.characters.length, movie.charactersType.length);
+
+  for (var i = 0; i < charTypes.length; ++i) {
+    assert.strictEqual(movie.charactersType[i], charTypes[i]);
+  }
+
+  var bookReader7 = movie.characters[0];
+  assert.strictEqual(bookReader7 instanceof Test.BookReaderT, true);
+  assert.strictEqual(bookReader7.booksRead, 7);
+  
+  var attacker = movie.characters[1];
+  assert.strictEqual(attacker instanceof Test.AttackerT, true);
+  assert.strictEqual(attacker.swordAttackDamage, 5);
+  
+  var bookReader2 = movie.characters[2];
+  assert.strictEqual(bookReader2 instanceof Test.BookReaderT, true);
+  assert.strictEqual(bookReader2.booksRead, 2);
+
+  if(isTsTest) {
+    var other = movie.characters[3];
+    assert.strictEqual(other, "I am other");
+  }
+}
+
+function createMovie(fbb) {
+  Test.Attacker.startAttacker(fbb);
+  Test.Attacker.addSwordAttackDamage(fbb, 5);
+  var attackerOffset = Test.Attacker.endAttacker(fbb);
+
+  var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
+  var charsOffset = 0;
+
+  if(isTsTest) {
+    let otherOffset = fbb.createString("I am other");
+
+    charsOffset = Test.Movie.createCharactersVector(
+      fbb,
+      [
+        Test.BookReader.createBookReader(fbb, 7),
+        attackerOffset,
+        Test.BookReader.createBookReader(fbb, 2),
+        otherOffset
+      ]
+    );
+  } else {
+    charsOffset = Test.Movie.createCharactersVector(
+      fbb,
+      [
+        Test.BookReader.createBookReader(fbb, 7),
+        attackerOffset,
+        Test.BookReader.createBookReader(fbb, 2)
+      ]
+    );
+  }
+
+  Test.Movie.startMovie(fbb);
+  Test.Movie.addCharactersType(fbb, charTypesOffset);
+  Test.Movie.addCharacters(fbb, charsOffset);
+  Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb))
+}
+
+function main() {
+  var fbb = new flatbuffers.Builder();
+
+  createMovie(fbb);
+
+  var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
+
+  var movie = Test.Movie.getRootAsMovie(buf);
+  testMovieBuf(movie);
+
+  if(isTsTest) {
+    testMovieUnpack(movie.unpack());
+
+    var movie_to = new Test.MovieT();
+    movie.unpackTo(movie_to);
+    testMovieUnpack(movie_to);
+
+    fbb.clear();
+    Test.Movie.finishMovieBuffer(fbb, movie_to.pack(fbb));
+    var unpackBuf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
+    testMovieBuf(Test.Movie.getRootAsMovie(unpackBuf));
+  }
+
   console.log('FlatBuffers union vector test: completed successfully');
 }
 
