function MetadataClass(options) {
  options = options ?? Frozen.EMPTY_OBJECT;
  const id = options.id;

  //>>includeStart('debug', pragmas.debug);
  Check.typeOf.string("options.id", id);
  //>>includeEnd('debug');

  const properties = options.properties ?? {};
  const propertiesBySemantic = {};
  for (const propertyId in properties) {
    if (properties.hasOwnProperty(propertyId)) {
      const property = properties[propertyId];
      if (defined(property.semantic)) {
        propertiesBySemantic[property.semantic] = property;
      }
    }
  }

  this._id = id;
  this._name = options.name;
  this._description = options.description;
  this._properties = properties;
  this._propertiesBySemantic = propertiesBySemantic;
  this._extras = clone(options.extras, true);
  this._extensions = clone(options.extensions, true);
}
A metadata class.

<p>
See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles
</p>

@param {object} options Object with the following properties:
@param {string} options.id The ID of the class.
@param {string} [options.name] The name of the class.
@param {string} [options.description] The description of the class.
@param {Object<string, MetadataClassProperty>} [options.properties] The class properties, where each key is the property ID.
@param {*} [options.extras] Extra user-defined properties.
@param {object} [options.extensions] An object containing extensions.

@alias MetadataClass
@constructor
@experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.