-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathtypes.mjs
More file actions
96 lines (75 loc) · 2.27 KB
/
types.mjs
File metadata and controls
96 lines (75 loc) · 2.27 KB
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
const union = (arr, sep = '|') =>
arr?.length ? arr.map(resolve).join(sep) : 'unknown';
const resolve = type => {
if (!type) return 'unknown';
switch (type.type) {
case 'intrinsic':
case 'reference': {
const args = type.typeArguments?.length
? `<${type.typeArguments.map(resolve).join(', ')}>`
: '';
return type.name + args;
}
case 'literal':
return typeof type.value === 'string'
? JSON.stringify(type.value)
: String(type.value);
case 'array':
return resolve(type.elementType) + '[]';
case 'tuple':
return `Tuple<${union(type.elements, ', ')}>`;
case 'union':
return union(type.types);
case 'intersection':
return union(type.types, '&');
case 'optional':
return resolve(type.elementType);
case 'indexedAccess':
return `${resolve(type.objectType)}[${resolve(type.indexType)}]`;
case 'predicate': {
const target = type.targetType ? ` is ${resolve(type.targetType)}` : '';
return (type.asserts ? 'asserts ' : '') + type.name + target;
}
case 'templateLiteral':
return (
'`' +
type.head +
type.tail.map(([t, s]) => '${' + resolve(t) + '}' + s).join('') +
'`'
);
case 'query':
return resolve(type.queryType);
case 'typeOperator':
return resolve(type.target);
case 'conditional':
return `${resolve(type.trueType)}|${resolve(type.falseType)}`;
case 'named-tuple-member':
return resolve(type.element);
case 'reflection':
return 'object';
case 'inferred':
case 'unknown':
return 'unknown';
default:
return type.name ?? 'unknown';
}
};
export const someType = model => `{${resolve(model)}}`;
export const arrayType = someType,
conditionalType = someType,
indexAccessType = someType,
inferredType = someType,
intersectionType = someType,
intrinsicType = someType,
literalType = someType,
namedTupleType = someType,
optionalType = someType,
queryType = someType,
referenceType = someType,
reflectionType = someType,
tupleType = someType,
typeOperatorType = someType,
unionType = someType,
unknownType = someType;
export const declarationType = () => '{object}';
export const functionType = () => '{Function}';