suddenlyGiovanni
4/20/2019 - 10:03 AM

isObject

// Setup
function assert<T extends unknown>(condition: T, message?: string): void {
  if (!condition) {
    throw new Error(message || `Assertion failed, condition was ${Boolean(condition)}`)
  }
}

function isUndefined(value: unknown): value is undefined {
  return value === undefined
}

assert(isUndefined(null) === false)
assert(isUndefined(NaN) === false)
assert(isUndefined(null) === false)
assert(isUndefined(undefined) === true)

function isNull(value: unknown): value is null {
  return value === null
}

assert(isNull(undefined) === false)
assert(isNull({}) === false)
assert(isNull(null) === true)

function isArray(value: unknown): value is Array<typeof value> {
  return Array.isArray(value)
}

assert(isArray('aaa') === false)
assert(isArray(1) === false)
assert(isArray({}) === false)
assert(isArray(() => {}) === false)
assert(isArray(false) === false)
assert(isArray([]) === true)
assert(isArray([1, 'string', true, { 0: 'foo', baz: 'bar' }, ['array']]) === true)

function isObject(value: unknown): value is Object {
  return !isNull(value) && !isArray(value) && typeof value === 'object'
  // return !isUndefined(value) && !isNull(value) && value.constructor === Object
}

assert(isObject(1) === false)
assert(isObject(NaN) === false)
assert(isObject(null) === false)
assert(isObject(undefined) === false)
assert(isObject(() => {}) === false)
assert(isObject([]) === false)
assert(isObject({}) === true)
assert(isObject(new Object()) === true)
assert(isObject(new Object(null)) === true)
assert(isObject(new Object(undefined)) === true)
assert(isObject(new Object({ foo: 'bar' })) === true)
assert(isObject(Object.create({ bar: 'baz' })) === true)