-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
types.ts
105 lines (81 loc) · 3.06 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Underscore.js 1.8.3
// http://underscorejs.org
// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
import type {Arrayable, TypedArray} from "../types"
const toString = Object.prototype.toString
export function is_undefined(obj: unknown): obj is undefined {
return typeof obj === "undefined"
}
export function is_defined<T>(obj: T): obj is (T extends undefined ? never : T) {
return typeof obj !== "undefined"
}
// XXX: use only to work around strict conditional expressions
export function is_nullish(obj: unknown): obj is null | undefined {
return obj == null
}
export function isNull(obj: unknown): obj is null | undefined {
return obj == null
}
export function isNotNull<T>(obj: T | null | undefined): obj is T {
return obj != null
}
export function isBoolean(obj: unknown): obj is boolean {
return obj === true || obj === false || toString.call(obj) === "[object Boolean]"
}
export function isNumber(obj: unknown): obj is number {
return toString.call(obj) === "[object Number]"
}
export function isInteger(obj: unknown): obj is number {
return isNumber(obj) && Number.isInteger(obj)
}
export function isString(obj: unknown): obj is string {
return toString.call(obj) === "[object String]"
}
export function isSymbol(obj: unknown): obj is symbol {
return typeof obj === "symbol"
}
export type Primitive = null | boolean | number | string | symbol
export function isPrimitive(obj: unknown): obj is Primitive {
return obj === null || isBoolean(obj) || isNumber(obj) || isString(obj) || isSymbol(obj)
}
export function isFunction(obj: unknown): obj is Function {
const rep = toString.call(obj)
return rep === "[object Function]" || rep === "[object AsyncFunction]"
}
export function isArray<T>(obj: unknown): obj is T[] {
return Array.isArray(obj)
}
export function isArrayOf<T>(array: unknown[], predicate: (item: unknown) => item is T): array is T[] {
for (const item of array) {
if (!predicate(item))
return false
}
return true
}
export function isArrayableOf<T>(array: Arrayable, predicate: (item: unknown) => item is T): array is Arrayable<T> {
for (const item of array) {
if (!predicate(item))
return false
}
return true
}
export function isTypedArray(obj: unknown): obj is TypedArray {
return ArrayBuffer.isView(obj) && !(obj instanceof DataView)
}
export function isObject(obj: unknown): obj is object {
const tp = typeof obj
return tp === "function" || tp === "object" && !!obj
}
export function isBasicObject<T>(obj: unknown): obj is {[key: string]: T} {
return isObject(obj) && is_nullish(obj.constructor)
}
export function isPlainObject<T>(obj: unknown): obj is {[key: string]: T} {
return isObject(obj) && (is_nullish(obj.constructor) || obj.constructor === Object)
}
export function isIterable(obj: unknown): obj is Iterable<unknown> {
return isObject(obj) && Symbol.iterator in obj
}
export function isArrayable(obj: unknown): obj is Arrayable<unknown> {
return isIterable(obj) && "length" in obj
}