code: function parse(string) {
    if (!string || typeof string !== 'string') {
      throw new TypeError('argument string is required')
    }
  
    var match = dispositionTypeRegExp.exec(string)
  
    if (!match) {
      throw new TypeError('invalid type format')
    }
  
    // normalize type
    var index = match[0].length
    var type = match[1].toLowerCase()
  
    var key
    var names = []
    var params = {}
    var value
  
    // calculate index to start at
    index = paramRegExp.lastIndex = match[0].substr(-1) === ';'
      ? index - 1
      : index
  
    // match parameters
    while (match = paramRegExp.exec(string)) {
      if (match.index !== index) {
        throw new TypeError('invalid parameter format')
      }
  
      index += match[0].length
      key = match[1].toLowerCase()
      value = match[2]
  
      if (names.indexOf(key) !== -1) {
        throw new TypeError('invalid duplicate parameter')
      }
  
      names.push(key)
  
      if (key.indexOf('*') + 1 === key.length) {
        // decode extended value
        key = key.slice(0, -1)
        value = decodefield(value)
  
        // overwrite existing value
        params[key] = value
        continue
      }
  
      if (typeof params[key] === 'string') {
        continue
      }
  
      if (value[0] === '"') {
        // remove quotes and escapes
        value = value
          .substr(1, value.length - 2)
          .replace(qescRegExp, '$1')
      }
  
      params[key] = value
    }
  
    if (index !== -1 && index !== string.length) {
      throw new TypeError('invalid parameter format')
    }
  
    return new ContentDisposition(type, params)
  }
docs: Parse Content-Disposition header string.
  
  @param {string} string
  @return {object}
  @api private