import toStringTag from '../../kind/toStringTag'
import isStringPrimitive from './isStringPrimitive'
/**
* Checks if `value` is classified as a `String` primitive or object.
*
* @name isString
* @since 3.0.0
* @category Lang
*
* @memberOf is
* @extends isStringPrimitive
* @variation also allows String objects
*
* @param {*} x The value to check.
* @return {boolean} Returns `true` if `value` is a string, else `false`.
*
* {@link https://nodejs.org/api/util.html#util_util_isstring_object node-util-isstring}
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L1318 underscore-isstring}
* {@link https://github.com/infernojs/inferno/blob/master/packages/inferno-shared/src/index.ts#L42 inferno-isstring}
* {@link https://github.com/ramda/ramda/blob/master/src/internal/_isString.js ramda-is-string}
* {@link https://github.com/js-data/js-data/blob/v2/src/utils.js#L57 js-data-is-string}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String mozilla-string}
* {@link https://github.com/lodash/lodash/blob/master/isString.js lodash-isString}
* @see {@link lodash-isString}
* @see {@link mozilla-string}
* @see {@link js-data-is-string}
* @see {@link ramda-is-string}
* @see {@link inferno-isstring}
* @see {@link underscore-isstring}
* @see {@link node-util-isstring}
* @see isStringPrimitive
*
* @example
*
* isString('abc')
* //=> true
*
* isString(new String('abc'))
* //=> true
*
* isString(1)
* //=> false
*
*/
const isString = (x: any): x is string | String =>
isStringPrimitive(x) || toStringTag(x) === '[object String]'
export { isString }
export default isString