export function isDeepEqual ( a , b ) { const o1 = a instanceof Object ; const o2 = b instanceof Object ; if ( ! o1 || ! o2 ) { return a === b ; } if ( Object . keys ( a ) . length !== Object . keys ( b ) . length ) { return false ; } for ( const o in a ) { const t1 = a [ o ] instanceof Object ; const t2 = b [ o ] instanceof Object ; if ( t1 && t2 ) { if ( ! isDeepEqual ( a [ o ] , b [ o ] ) ) return false ; } else if ( a [ o ] !== b [ o ] ) { return false ; } } return true ; } function isType ( o , t ) { return Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) === t ; } param o returns export const isNull = ( o ) : o is null => isType ( o , 'Null' ) ; param o returns export const isUndefined = ( o ) : o is undefined => isType ( o , 'Undefined' ) ; param o returns export const isObject = ( o ) : o is Object => isType ( o , 'Object' ) ; param o returns export const isArray = ( o ) : o is Array < any > => isType ( o , 'Array' ) ; param o returns export const isDate = ( o ) : o is Date => isType ( o , 'Date' ) ; param o returns export const isFunction = ( o ) : o is Function => isType ( o , 'Function' ) ; param o returns export const isBoolean = ( o ) : o is boolean => isType ( o , 'Boolean' ) ; param o returns export const isString = ( o ) : o is string => isType ( o , 'String' ) ; param o returns export const isNumber = ( o ) : o is number => isType ( o , 'Number' ) ;