(typeNode: ts.TypeNode)
| 155 | } |
| 156 | |
| 157 | function serializeTypeExpression(typeNode: ts.TypeNode): TypeExpression { |
| 158 | if (ts.isUnionTypeNode(typeNode)) { |
| 159 | return { |
| 160 | type: 'union', |
| 161 | unionOrIntersectionList: typeNode.types.map((childTypeNode) => { |
| 162 | return serializeTypeExpression(childTypeNode) |
| 163 | }), |
| 164 | } |
| 165 | } else if (ts.isIntersectionTypeNode(typeNode)) { |
| 166 | return { |
| 167 | type: 'intersection', |
| 168 | unionOrIntersectionList: typeNode.types.map((childTypeNode) => { |
| 169 | return serializeTypeExpression(childTypeNode) |
| 170 | }), |
| 171 | } |
| 172 | } else if (ts.isTypeReferenceNode(typeNode)) { |
| 173 | const type = checker.getTypeFromTypeNode(typeNode) |
| 174 | serializeType(type) |
| 175 | |
| 176 | // Note: I am ignoring type arguments e.g. HTMLCollectionOf<HTMLScriptElement> |
| 177 | // This will come through as a plain HTMLCollectionOf. |
| 178 | // TODO: Parse typeNode.typeArguments into something useful. |
| 179 | return { type: 'reference', reference: typeNode.typeName.getText() } |
| 180 | } else if (ts.isParenthesizedTypeNode(typeNode)) { |
| 181 | const parType = typeNode as ts.ParenthesizedTypeNode |
| 182 | return serializeTypeExpression(parType.type) |
| 183 | } else if (ts.isFunctionTypeNode(typeNode)) { |
| 184 | const funcType = typeNode as ts.FunctionTypeNode |
| 185 | return { type: 'function', function: serializeFunctionTypeExpression(funcType) } |
| 186 | } else if (ts.isTypeLiteralNode(typeNode)) { |
| 187 | return { type: 'literal', literal: typeNode.getText() } |
| 188 | } else if (ts.isArrayTypeNode(typeNode)) { |
| 189 | return { type: 'array' } |
| 190 | } else if (ts.isThisTypeNode(typeNode)) { |
| 191 | return { type: 'this' } |
| 192 | } else if (typeNode.kind === ts.SyntaxKind.NumberKeyword) { |
| 193 | return { type: 'reference', reference: 'Number' } |
| 194 | } else if (typeNode.kind === ts.SyntaxKind.StringKeyword) { |
| 195 | return { type: 'reference', reference: 'String' } |
| 196 | } else if (typeNode.kind === ts.SyntaxKind.BooleanKeyword) { |
| 197 | return { type: 'reference', reference: 'Boolean' } |
| 198 | } else if (typeNode.kind === ts.SyntaxKind.UnknownKeyword) { |
| 199 | return { type: 'unknown' } |
| 200 | } else if (typeNode.kind === ts.SyntaxKind.UndefinedKeyword) { |
| 201 | return { type: 'undefined' } |
| 202 | } else if (typeNode.kind === ts.SyntaxKind.NullKeyword) { |
| 203 | return { type: 'null' } |
| 204 | } else if (typeNode.kind === ts.SyntaxKind.AnyKeyword) { |
| 205 | return { type: 'any' } |
| 206 | } else if (typeNode.kind === ts.SyntaxKind.VoidKeyword) { |
| 207 | return { type: 'void' } |
| 208 | } else { |
| 209 | console.log('???', ts.SyntaxKind[typeNode.kind]) |
| 210 | console.log(typeNode.getText()) |
| 211 | } |
| 212 | |
| 213 | return { type: 'any' } |
| 214 | } |
no test coverage detected