Skip to main content
Module

x/ts_serialize/docs/transforming.md

A zero dependency library for serializing data
Go to Latest
File

Global transformKey

Serializable has an optional function tsTransformKey(key: string): string, we also provide an interface TransformKey to implement for type safety. This function can be provided to change all the keys without having to specify the change for each property.

class TestTransformKey extends Serializable implements TransformKey {
  public tsTransformKey(key: string): string {
    return `__${key}__`;
  }

  @SerializeProperty()
  public test = "test";
}

assertEquals(new TestTransformKey().toJson(), `{"__test__":"test"}`);
assertEquals(
  new TestTransformKey().fromJson({ __test__: "changed" }).test,
  `changed`
);

tsTransformKey will be inherited by children:

class TestTransformKey extends Serializable implements TransformKey {
  public tsTransformKey(key: string): string {
    return `__${key}__`;
  }
}

class TestTransformKey2 extends TestTransformKey {
  @SerializeProperty()
  public test2 = "test2";
}

class TestTransformKey3 extends TestTransformKey2 {
  @SerializeProperty()
  public test3 = "test3";
}

assertEquals(
  new TestTransformKey3().toJson(),
  `{"__test2__":"test2","__test3__":"test3"}`
);
assertEquals(
  new TestTransformKey3().fromJson({ __test3__: "changed" }).test3,
  `changed`
);

Children can also override their parent tsTransformKey function:

class TestTransformKey extends Serializable implements TransformKey {
  public tsTransformKey(key: string): string {
    return `__${key}__`;
  }
}

class TestTransformKey2 extends TestTransformKey {
  @SerializeProperty()
  public test2 = "test2";
}

class TestTransformKey3 extends TestTransformKey2 implements TransformKey {
  public tsTransformKey(key: string): string {
    return `--${key}--`;
  }
  @SerializeProperty()
  public test3 = "test3";
}

class TestTransformKey4 extends TestTransformKey3 {
  @SerializeProperty()
  public test4 = "test4";
}
assertEquals(
  new TestTransformKey4().toJson(),
  `{"__test2__":"test2","--test3--":"test3","--test4--":"test4"}`
);
assertEquals(
  new TestTransformKey4().fromJson({ "--test4--": "changed" }).test4,
  `changed`
);

If tsTransformKey is implemented and SerializeProperty is provided a serializedKey option, it will override the tsTransformKey function:

class TestTransformKey extends Serializable implements TransformKey {
  public tsTransformKey(key: string): string {
    return `__${key}__`;
  }
}

class TestTransformKey2 extends TestTransformKey {
  @SerializeProperty()
  public test2 = "test2";

  @SerializeProperty("changed")
  public changeMe = "change me";

  @SerializeProperty({ serializedKey: "changed2" })
  public changeMe2 = "change me2";
}

assertEquals(
  new TestTransformKey2().toJson(),
  `{"__test2__":"test2","changed":"change me","changed2":"change me2"}`
);
assertEquals(
  new TestTransformKey2().fromJson({ changed: "changed" }).changeMe,
  `changed`
);
assertEquals(
  new TestTransformKey2().fromJson({ changed2: "changed" }).changeMe2,
  `changed`
);

tsTransformKey is an efficient way to deal with camelCase to snake_case conversions.