flatbuffers icon indicating copy to clipboard operation
flatbuffers copied to clipboard

[TS] Feature Request: Make optional field getters return `undefined` (instead of `null`) if the value is not set

Open jmillan opened this issue 3 years ago • 8 comments

Flatbuffers version:master OS: Mac OS BigSur

If I wanted to create a flatbuffers table that represents the following TS type:

type Foo = {
 name?: string; 
}

which is the same as:

type Foo = {
 name: string | undefined; 
}

..., I would define the following table, which represents a type with an optional field name of type string.

table Foo {
  name:string;
}

When generating the TS code of Foo table, the obtained code is as follows:

export class Foo {
..
..
..
name():string|null
name(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
name(optionalEncoding?:any):string|Uint8Array|null {
  const offset = this.bb!.__offset(this.bb_pos, 4);
  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
}

The return type of name() method is string|null, whereas string|undefined would perfectly match the optional fields defined in TS as exposed above.

I'm finding myself manually converting types due to this. It would be great to have a flatc option to indicate that optional field getters should return undefined instead of null if a value is not set.

Is there any reason for not having this? Would you be willing to accept a contribution for this feature request?

jmillan avatar Nov 21 '22 15:11 jmillan

At the same time, if a table field is required I would expect it NOT to return null nor undefined, at least when generating the object API, in the unpack() method, but the field type in question.

jmillan avatar Nov 21 '22 16:11 jmillan

Hi, developers. Any update or thoughts about this? IMHO it makes lot of sense.

ibc avatar Apr 20 '23 18:04 ibc

This issue is stale because it has been open 6 months with no activity. Please comment or label not-stale, or this will be closed in 14 days.

github-actions[bot] avatar Oct 19 '23 20:10 github-actions[bot]

Just keeping this alive.

ibc avatar Oct 19 '23 21:10 ibc

Hi, not a TS person, but are you envisioning a flag that changes every accessor or adding a key to the schema? The global flag seems too coarse grained for sufficiently large projects. I think its plausible that depending on the type null may be preferred to undefined and vice versa.

Adding field or table level options seems like more work but ultimately a better solution, e.g.

table Foo {
  // field level option?
  foo: string (ts_getter_null_to_undefined);
}
// and also a table level option to save typing?
table Bar (ts_getter_null_to_undefined) {
}

CasperN avatar Oct 29 '23 16:10 CasperN

I would say this should come as a flatc option, being a language specific matter.

If you use 'undefined' rather than 'null' in your project you would need to add such flag everywhere in the schema otherwise. Usually you use one of them and not mix them.

jmillan avatar Nov 01 '23 13:11 jmillan

This issue is stale because it has been open 6 months with no activity. Please comment or label not-stale, or this will be closed in 14 days.

github-actions[bot] avatar May 01 '24 20:05 github-actions[bot]

Ping

ibc avatar May 01 '24 21:05 ibc