diff --git a/ts/builder.ts b/ts/builder.ts
index 137031e..344a629 100644
--- a/ts/builder.ts
+++ b/ts/builder.ts
@@ -1,7 +1,6 @@
-import { ByteBuffer } from "./byte-buffer"
-import { SIZEOF_SHORT, SIZE_PREFIX_LENGTH, SIZEOF_INT, FILE_IDENTIFIER_LENGTH } from "./constants"
-import { Offset, IGeneratedObject } from "./types"
-import { Long } from "./long"
+import { ByteBuffer } from "./byte-buffer.js"
+import { SIZEOF_SHORT, SIZE_PREFIX_LENGTH, SIZEOF_INT, FILE_IDENTIFIER_LENGTH } from "./constants.js"
+import { Offset, IGeneratedObject } from "./types.js"
 
 export class Builder {
     private bb: ByteBuffer
@@ -136,7 +135,7 @@
       this.bb.writeInt32(this.space -= 4, value);
     }
   
-    writeInt64(value: Long): void {
+    writeInt64(value: bigint): void {
       this.bb.writeInt64(this.space -= 8, value);
     }
   
@@ -179,7 +178,7 @@
      * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).
      * @param value The `int64` to add the the buffer.
      */
-    addInt64(value: Long): void {
+    addInt64(value: bigint): void {
       this.prep(8, 0);
       this.writeInt64(value);
     }
@@ -223,8 +222,8 @@
       }
     }
   
-    addFieldInt64(voffset: number, value: Long, defaultValue: Long): void {
-      if (this.force_defaults || !value.equals(defaultValue)) {
+    addFieldInt64(voffset: number, value: bigint, defaultValue: bigint): void {
+      if (this.force_defaults || value !== defaultValue) {
         this.addInt64(value);
         this.slot(voffset);
       }
@@ -523,8 +522,11 @@
      * @param s The string to encode
      * @return The offset in the buffer where the encoded string starts
      */
-    createString(s: string | Uint8Array): Offset {
-      if (!s) { return 0 }
+    createString(s: string | Uint8Array | null | undefined): Offset {
+      if (s === null || s === undefined) {
+        return 0;
+      }
+
       let utf8: string | Uint8Array | number[];
       if (s instanceof Uint8Array) {
         utf8 = s;
@@ -575,18 +577,11 @@
     }
   
     /**
-     * A helper function to avoid generated code depending on this file directly.
-     */
-    createLong(low: number, high: number): Long {
-      return Long.create(low, high);
-    }
-  
-    /**
      * A helper function to pack an object
      * 
      * @returns offset of obj
      */
-    createObjectOffset(obj: string | IGeneratedObject): Offset {
+    createObjectOffset(obj: string | any): Offset {
       if(obj === null) {
         return 0
       }
@@ -603,7 +598,7 @@
      * 
      * @returns list of offsets of each non null object
      */
-    createObjectOffsetList(list: string[]): Offset[] {
+    createObjectOffsetList(list: string[] | any[]): Offset[] {
       const ret: number[] = [];
   
       for(let i = 0; i < list.length; ++i) {
@@ -620,7 +615,7 @@
       return ret;
     }
   
-    createStructOffsetList(list: string[], startFunc: (builder: Builder, length: number) => void): Offset {
+    createStructOffsetList(list: string[] | any[], startFunc: (builder: Builder, length: number) => void): Offset {
       startFunc(this, list.length);
       this.createObjectOffsetList(list);
       return this.endVector();
