constructor(options) {
    options = options || {};

    /**
     * @type {Loader}
     */
    let loader = options.loader;

    /**
     * @type {string}
     */
    let key;

    if (options.url) {
      loader = makeLoaderFromUrlLike(options.url);
      key = keyFromUrlLike(options.url);
    }

    /**
     * @type {import('./Source.js').State}
     */
    const state = !loader ? 'loading' : options.state;

    const wrapX = options.wrapX === undefined ? true : options.wrapX;

    super({
      loader: loader,
      key: key,
      attributions: options.attributions,
      attributionsCollapsible: options.attributionsCollapsible,
      maxZoom: options.maxZoom,
      minZoom: options.minZoom,
      tileSize: options.tileSize,
      gutter: options.gutter,
      maxResolution: options.maxResolution,
      projection: options.projection,
      tileGrid: options.tileGrid,
      state: state,
      wrapX: wrapX,
      transition: options.transition,
      interpolate: options.interpolate !== false,
      crossOrigin: options.crossOrigin,
      zDirection: options.zDirection,
    });
  }
@param {Options} [options] DataTile source options.