// 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)