Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Yeah we use nestjs decoratos as well, but there's limitations, since the decorators run at runtime.

For example, we wanted to create a Query DTO for our API. It would be a generic class that allowed you to specify the fields you wanted to return in a query, like:

  {
    include: ["Field", "Foo", "Bar"]
  }
You can construct this in typescript like:

  class Foo {
    bar: number | undefined;
    foo: string | undefined;
  };

  class Query<T> {
    includes: Array<keyof T> | undefined;
  };
And use the query like:

  let q = new Query<Foo>;
  q.includes = ["foo", "baz"]; // fail: "baz" isn't in `keyof Foo`;
But since types are erased at runtime, and typescript classes don't work like ES6 classes (which would actually make a hack to support this kind of runtime validation available), you can't validate through an enum on the field, like:

  class Query<T> {
    @ApiProperty({
      enum: keyof T // meaningless at runtime, won't compile
    });
    includes: Array<keyof T> | undefined;
  }
And since Object.keys doesn't work, you can't validate the keys for the object at runtime unless you ditch the generic and just write out the same boilerplate code over and over again with different values for every type you want to be able to query.

Typescript was obviously designed to run in a browser, where it originates data, and not on the backend where it receives data, since input validation is such a chore on the backend.

I don't even want a runtime call for `keyof T` like `typeof`; I just want typescript to compile `keyof T` into an expanded array of strings. I would even settle for a C/C++ style preprocessor macro support. There have been times when I wish I could just log the filename of a function in an error using a preprocessor like in C/C++:

  cout << "Error in file: " << __FILE__ << endl;


Use zod or io-ts, they solve this problem (though I agree that having something native to the language would be nice, if it were practical).




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: