Symbols

If there are need to add some additional data on converted objects symbol fields can be specified, during JTC.convert they will be initialized depending on corresponding object.

INIT (default)

In this strategy symbol fields will be initialized during conversion

const APP_INFO = Symbol(`APP_INFO`);

class AppInfo {
   public isSelected: boolean;

   constructor(
      public id: number,
   ) { }
}

class User {
   public id: number;
   public name: string;

   public [APP_INFO]: AppInfo;
}

const USER_META = new ObjectMeta<User>({
   builder: User,
   fields: {
      id: new NumberField(),
      name: new StringField(),
      [APP_INFO]: ({ id }) => new AppInfo(id),
   }
});

const values = [
   {
      id: 1,
      name: `Vasya`,
   },
   {
      id: 2,
      name: `Masha`,
   },
];

const result = JTC.convert({
   id: `Symbols`,
   meta: new ObjectArrayMeta({ meta: USER_META }),
   values
});

const users = result.converted.all;

console.log(users);

console.log(users[0][APP_INFO].id === 1); // true
console.log(users[1][APP_INFO].id === 2); // true

SHARE

When converting an object which already have initialized symbols, converted one will share same symbol value with origin

const APP_INFO = Symbol(`APP_INFO`);

class AppInfo {
   public isSelected: boolean;
   
   constructor(
      public id: number,
   ) { }
}

class User {
   public id: number;
   public name: string;
   
   public [APP_INFO]: AppInfo;
}

const USER_META = new ObjectMeta<User>({
   builder: User,
   fields: {
      id: new NumberField(),
      name: new StringField(),
      [APP_INFO]: ({ id }) => new AppInfo(id),
   }
});

const values = [
   {
      id: 1,
      name: `Vasya`,
   },
   {
      id: 2,
      name: `Masha`,
   },
];

const result_1 = JTC.convert({
   id: `Symbols Share 1`,
   meta: new ObjectArrayMeta({ meta: USER_META }),
   values,
});

const users_1 = result_1.converted.all;

const result_2 = JTC.convert({
   id: `Symbols Share 1`,
   meta: new ObjectArrayMeta({ meta: USER_META }),
   values: users_1,
   SSymbols: `SHARE`
});

const users_2 = result_2.converted.all;

for (let i = 0; i < values.length; i++) {
   const user_1 = users_1[i];
   const user_2 = users_2[i];
   console.log(user_1[APP_INFO] === user_2[APP_INFO]); // true
}

Last updated

Was this helpful?