-
-
Notifications
You must be signed in to change notification settings - Fork 22
/
ts.utils.ts
35 lines (31 loc) · 1.03 KB
/
ts.utils.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
import ts from "typescript";
export const TSUtils = {
isTypeUnion: (typeNode: ts.TypeNode | undefined): typeNode is ts.UnionTypeNode => {
return typeNode?.kind === ts.SyntaxKind.UnionType;
},
isTsUnionType(type: ts.Type): type is ts.UnionType {
return type.flags === ts.TypeFlags.Union;
},
isTsTypeReference(type: ts.Type): type is ts.TypeReference {
return TSUtils.isTsObjectType(type) && type.objectFlags === ts.ObjectFlags.Reference;
},
isTsArrayUnionType(
checker: ts.TypeChecker,
type: ts.Type,
): type is ts.ObjectType & {
objectFlags: ts.ObjectFlags.Reference;
resolvedTypeArguments: (ts.TypeReference & { types: [ts.UnionType] })[];
} {
if (!TSUtils.isTsTypeReference(type)) {
return false;
}
const firstArgument = checker.getTypeArguments(type)[0];
if (firstArgument === undefined) {
return false;
}
return TSUtils.isTsUnionType(firstArgument);
},
isTsObjectType(type: ts.Type): type is ts.ObjectType {
return type.flags === ts.TypeFlags.Object;
},
};