Learn more  » Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

skava / exotic   js

Repository URL to install this package:

Version: 2.0.8 

/ src / types / obj / check / isObjPure.ts

import isArray from '../../array/check/isArray'
import isFunction from '../../function/check/isFunction'
import isObjNotNull from './isObjNotNull'

/**
 * @name isObjPure
 * @memberOf is
 *
 * @alias isObjNotArrayOrFunction
 * @alias isObjectNotArrayOrFunction
 * @alias isObjectPure
 * @alias isPureObject
 *
 * @since 3.0.0
 *
 * @param x value to check
 * @return is obj & !null & !undefined & !array & !function
 *
 * @extends isArray
 * @extends isObjNotNull
 * @extends isNullOrUndefined
 * @extends isFunction
 *
 * @example
 *
 *    isObjPure(function() {})
 *    //=> false
 *    isObjPure(null)
 *    //=> false
 *    isObjPure([])
 *    //=> false
 *
 *    isObjPure({})
 *    //=> true
 *
 */
export type Obj<ValueType = any> = {
  [key: string]: ValueType
  [key: number]: ValueType
}
export interface IsObjPure<ValueType> extends Function {
  (x: Object): x is Obj<ValueType>
  (x: Array<any>): false
  (x: Function): false
  (x: any): boolean
}
// const isObjPure: IsObjPure = (x: any): boolean =>
//   isObjNotNull(x) && !isArray(x) && !isFunction(x)

type ReturnTypeIs<Arg> = Arg extends Array<any>
  ? false
  : Arg extends Function
    ? false
    : Arg extends {} | Map<any, any> | Set<any>
      ? true
      : boolean

/**
 * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html
 */
const isObjPure = <Type>(x: unknown): ReturnTypeIs<typeof x> => {
  if (isArray(x)) return false
  else if (isFunction(x)) return false
  else return isObjNotNull(x)
}

// const obj = {}
// const array = []
// const isArr: ReturnTypeIs<Array<any>> = isObjPure(array)
// const isObj: ReturnTypeIs<{}> = isObjPure(obj)


export { isObjPure }
export default isObjPure