checkRecursivelyPassableErrorPropertyDesc = (
  propName,
  desc,
  passStyleOfRecur,
  check = undefined,
) => {
  if (desc.enumerable) {
    return (
      !!check &&
      CX(check)`Passable Error ${q(
        propName,
      )} own property must not be enumerable: ${desc}`
    );
  }
  if (!hasOwn(desc, 'value')) {
    return (
      !!check &&
      CX(check)`Passable Error ${q(
        propName,
      )} own property must be a data property: ${desc}`
    );
  }
  const { value } = desc;
  switch (propName) {
    case 'message':
    case 'stack': {
      return (
        typeof value === 'string' ||
        (!!check &&
          CX(check)`Passable Error ${q(
            propName,
          )} own property must be a string: ${value}`)
      );
    }
    case 'cause': {
      // eslint-disable-next-line no-use-before-define
      return checkRecursivelyPassableError(value, passStyleOfRecur, check);
    }
    case 'errors': {
      if (!Array.isArray(value) || passStyleOfRecur(value) !== 'copyArray') {
        return (
          !!check &&
          CX(check)`Passable Error ${q(
            propName,
          )} own property must be a copyArray: ${value}`
        );
      }
      return value.every(err =>
        // eslint-disable-next-line no-use-before-define
        checkRecursivelyPassableError(err, passStyleOfRecur, check),
      );
    }
    default: {
      break;
    }
  }
  return (
    !!check &&
    CX(check)`Passable Error has extra unpassed property ${q(propName)}`
  );
}
@param {string} propName
@param {PropertyDescriptor} desc
@param {(val: any) => PassStyle} passStyleOfRecur
@param {Checker} [check]
@returns {boolean}