diff --git a/tests/ts/reflection/key-value.js b/tests/ts/reflection/key-value.js
new file mode 100644
index 0000000..622b4f2
--- /dev/null
+++ b/tests/ts/reflection/key-value.js
@@ -0,0 +1,69 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+import * as flatbuffers from 'flatbuffers';
+export class KeyValue {
+    constructor() {
+        this.bb = null;
+        this.bb_pos = 0;
+    }
+    __init(i, bb) {
+        this.bb_pos = i;
+        this.bb = bb;
+        return this;
+    }
+    static getRootAsKeyValue(bb, obj) {
+        return (obj || new KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    static getSizePrefixedRootAsKeyValue(bb, obj) {
+        bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+        return (obj || new KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    key(optionalEncoding) {
+        const offset = this.bb.__offset(this.bb_pos, 4);
+        return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
+    }
+    value(optionalEncoding) {
+        const offset = this.bb.__offset(this.bb_pos, 6);
+        return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
+    }
+    static getFullyQualifiedName() {
+        return 'reflection_KeyValue';
+    }
+    static startKeyValue(builder) {
+        builder.startObject(2);
+    }
+    static addKey(builder, keyOffset) {
+        builder.addFieldOffset(0, keyOffset, 0);
+    }
+    static addValue(builder, valueOffset) {
+        builder.addFieldOffset(1, valueOffset, 0);
+    }
+    static endKeyValue(builder) {
+        const offset = builder.endObject();
+        builder.requiredField(offset, 4); // key
+        return offset;
+    }
+    static createKeyValue(builder, keyOffset, valueOffset) {
+        KeyValue.startKeyValue(builder);
+        KeyValue.addKey(builder, keyOffset);
+        KeyValue.addValue(builder, valueOffset);
+        return KeyValue.endKeyValue(builder);
+    }
+    unpack() {
+        return new KeyValueT(this.key(), this.value());
+    }
+    unpackTo(_o) {
+        _o.key = this.key();
+        _o.value = this.value();
+    }
+}
+export class KeyValueT {
+    constructor(key = null, value = null) {
+        this.key = key;
+        this.value = value;
+    }
+    pack(builder) {
+        const key = (this.key !== null ? builder.createString(this.key) : 0);
+        const value = (this.value !== null ? builder.createString(this.value) : 0);
+        return KeyValue.createKeyValue(builder, key, value);
+    }
+}
