+ // Tuple
+ case SyntaxKind.TupleType: {
+ // In TS 4.0, the `elementTypes` property was changed to `elements`.
+ // To support both at compile time, we cast to access the newer version
+ // if the former does not exist.
+ const elementTypes = 'elementTypes' in node
+ ? node.elementTypes.map((el) => this.convertType(el))
+ : node.elements.map((el) => this.convertType(el));
+ return this.createNode(node, {
+ type: ts_estree_1.AST_NODE_TYPES.TSTupleType,
+ elementTypes,
+ });
+ }
+ case SyntaxKind.NamedTupleMember: {
+ const member = this.createNode(node, {
+ type: ts_estree_1.AST_NODE_TYPES.TSNamedTupleMember,
+ elementType: this.convertType(node.type, node),
+ label: this.convertChild(node.name, node),
+ optional: node.questionToken != null,
+ });
+ if (node.dotDotDotToken) {
+ // adjust the start to account for the "..."
+ member.range[0] = member.label.range[0];
+ member.loc.start = member.label.loc.start;
+ return this.createNode(node, {
+ type: ts_estree_1.AST_NODE_TYPES.TSRestType,
+ typeAnnotation: member,
+ });
+ }
+ return member;
+ }
+ case SyntaxKind.OptionalType: {
+ return this.createNode(node, {
+ type: ts_estree_1.AST_NODE_TYPES.TSOptionalType,
+ typeAnnotation: this.convertType(node.type),
+ });
+ }
+ case SyntaxKind.RestType: {
+ return this.createNode(node, {
+ type: ts_estree_1.AST_NODE_TYPES.TSRestType,
+ typeAnnotation: this.convertType(node.type),
+ });
+ }