NivoaN
tRPC2y ago
9 replies
Nivoa

When a procedure returns an instance of a class, the superjson isApplicable doesnt detect it

When a procedure returns an instance of a class, the superjson isApplicable doesnt detect it as that class, but when you return it inside an object or array, it does.
// ❌
class Test {
        a: string;
        constructor() {
          this.a = "a";
        }
        serialize() {
          return "a"
        }
        deserialize() {
          return "b"
        }
      }
test: publicProcedure
    .query(async ({ input, ctx }) => {
      return new Test()
    }),

// ✅
test: publicProcedure
    .query(async ({ input, ctx }) => {
      return { test: new Test() }
    }),


then in superjson:
superjson.registerCustom(
  {
    deserialize: (test) => {
      return null;
    },
    serialize: (test) => {
      return null;
    },
    isApplicable: (val: unknown) => {
      return val instanceof Test
    },
  },
  "Test",
);

what happens is that val is never an actual instanceof Test, it is an object with the properties of Test, but not the instance itself. But when I return it as the 2nd procedure, val.test instanceof Test evals to true.
is this a bug?
Was this page helpful?