Skip to content

[Feature Request] Improve TypeScript generator #43

@MrFoxPro

Description

@MrFoxPro

I believe output like with ts-proto when it's possible to encode plain objects would be much beter then using classes:

message ImageEditDescriptor {
	oneof type {
		bytes replacement = 1;
		string key = 2;
	}
}

output ts:

export interface ImageEditDescriptor {
  type?: { $case: "replacement"; replacement: Uint8Array } | { $case: "key"; key: string } | undefined;
}
export const ImageEditDescriptor = {
  encode(message: ImageEditDescriptor, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    switch (message.type?.$case) {
      case "replacement":
        writer.uint32(10).bytes(message.type.replacement);
        break;
      case "key":
        writer.uint32(18).string(message.type.key);
        break;
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): ImageEditDescriptor {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseImageEditDescriptor();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.type = { $case: "replacement", replacement: reader.bytes() };
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.type = { $case: "key", key: reader.string() };
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  create<I extends Exact<DeepPartial<ImageEditDescriptor>, I>>(base?: I): ImageEditDescriptor {
    return ImageEditDescriptor.fromPartial(base ?? ({} as any));
  },
  fromPartial<I extends Exact<DeepPartial<ImageEditDescriptor>, I>>(object: I): ImageEditDescriptor {
    const message = createBaseImageEditDescriptor();
    if (
      object.type?.$case === "replacement" &&
      object.type?.replacement !== undefined &&
      object.type?.replacement !== null
    ) {
      message.type = { $case: "replacement", replacement: object.type.replacement };
    }
    if (object.type?.$case === "key" && object.type?.key !== undefined && object.type?.key !== null) {
      message.type = { $case: "key", key: object.type.key };
    }
    return message;
  },
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions