code: function applyMixins(derivedCtor, baseCtors, mergeObjectKeys = []) {
      baseCtors.forEach(baseCtor => {
          Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
              const baseValue = baseCtor.prototype[name];
              const derivedValue = derivedCtor.prototype[name];
              try {
                  if ((typeof baseValue === 'object' && typeof derivedValue === 'object') && mergeObjectKeys.indexOf(name) >= 0) {
                      derivedCtor.prototype[name] = Object.assign({}, baseValue, derivedValue);
                  }
                  else {
                      derivedCtor.prototype[name] = baseValue;
                  }
              }
              catch (error) {
                  if (error.message.includes('which has only a getter')) {
                      let result = undefined;
                      if ((typeof baseValue === 'object' && typeof derivedValue === 'object') && mergeObjectKeys.indexOf(name) >= 0) {
                          result = Object.assign({}, baseValue, derivedValue);
                      }
                      else {
                          result = baseValue;
                      }
                      Object.defineProperty(derivedCtor, name, {
                          get() {
                              return result;
                          },
                      });
                  }
                  else {
                      throw error;
                  }
              }
          });
      });
  }
docs: Mixes baseCtors classes into derivedCtor class.
  All properties of baseCtors will be written to derivedCtor.
  If a property with the same name already exists in derivedCtor, it will be overwritten.
  For more information about typescript mixins see https://www.typescriptlang.org/docs/handbook/mixins.html
  
  @param derivedCtor the class into which baseCtors should be mixed in
  @param baseCtors the classes which should be mixed into derivedCtor
  @param mergeObjectKeys If the name of property is contained in mergeObjectKeys and the property exists as an object
  in both derivedCtor and baseCtor, both objects will be merged together instead of the baseCtor object overwriting
  the derivedCtor object. Be aware that deep merging is not supported and therefore "nested" properties with the same
  name in derivedCtor's object and baseCtor's object will still be overwritten by baseCtor's object values.