[typescript] parsing template literal as type (#9748)
This commit is contained in:
committed by
Nicolò Ribaudo
parent
444daf9224
commit
2867bbf195
@@ -660,6 +660,19 @@ export default (superClass: Class<Parser>): Class<Parser> =>
|
||||
return this.finishNode(node, "TSLiteralType");
|
||||
}
|
||||
|
||||
tsParseTemplateLiteralType(): N.TsType {
|
||||
const node: N.TsLiteralType = this.startNode();
|
||||
const templateNode = this.parseTemplate(false);
|
||||
if (templateNode.expressions.length > 0) {
|
||||
throw this.raise(
|
||||
templateNode.expressions[0].start,
|
||||
"Template literal types cannot have any substitution",
|
||||
);
|
||||
}
|
||||
node.literal = templateNode;
|
||||
return this.finishNode(node, "TSLiteralType");
|
||||
}
|
||||
|
||||
tsParseNonArrayType(): N.TsType {
|
||||
switch (this.state.type) {
|
||||
case tt.name:
|
||||
@@ -712,6 +725,8 @@ export default (superClass: Class<Parser>): Class<Parser> =>
|
||||
return this.tsParseTupleType();
|
||||
case tt.parenL:
|
||||
return this.tsParseParenthesizedType();
|
||||
case tt.backQuote:
|
||||
return this.tsParseTemplateLiteralType();
|
||||
}
|
||||
|
||||
throw this.unexpected();
|
||||
|
||||
@@ -1308,7 +1308,7 @@ export type TsMappedType = TsTypeBase & {
|
||||
|
||||
export type TsLiteralType = TsTypeBase & {
|
||||
type: "TSLiteralType",
|
||||
literal: NumericLiteral | StringLiteral | BooleanLiteral,
|
||||
literal: NumericLiteral | StringLiteral | BooleanLiteral | TemplateLiteral,
|
||||
};
|
||||
|
||||
export type TsImportType = TsTypeBase & {
|
||||
|
||||
1
packages/babel-parser/test/fixtures/typescript/types/literal-string-1/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/typescript/types/literal-string-1/input.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
let x: `foo`;
|
||||
154
packages/babel-parser/test/fixtures/typescript/types/literal-string-1/output.json
vendored
Normal file
154
packages/babel-parser/test/fixtures/typescript/types/literal-string-1/output.json
vendored
Normal file
@@ -0,0 +1,154 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 13,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 13
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 13,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 13
|
||||
}
|
||||
},
|
||||
"sourceType": "module",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "VariableDeclaration",
|
||||
"start": 0,
|
||||
"end": 13,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 13
|
||||
}
|
||||
},
|
||||
"declarations": [
|
||||
{
|
||||
"type": "VariableDeclarator",
|
||||
"start": 4,
|
||||
"end": 12,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 12,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
},
|
||||
"identifierName": "x"
|
||||
},
|
||||
"name": "x",
|
||||
"typeAnnotation": {
|
||||
"type": "TSTypeAnnotation",
|
||||
"start": 5,
|
||||
"end": 12,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 5
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
}
|
||||
},
|
||||
"typeAnnotation": {
|
||||
"type": "TSLiteralType",
|
||||
"start": 7,
|
||||
"end": 12,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
}
|
||||
},
|
||||
"literal": {
|
||||
"type": "TemplateLiteral",
|
||||
"start": 7,
|
||||
"end": 12,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
}
|
||||
},
|
||||
"expressions": [],
|
||||
"quasis": [
|
||||
{
|
||||
"type": "TemplateElement",
|
||||
"start": 8,
|
||||
"end": 11,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 11
|
||||
}
|
||||
},
|
||||
"value": {
|
||||
"raw": "foo",
|
||||
"cooked": "foo"
|
||||
},
|
||||
"tail": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"init": null
|
||||
}
|
||||
],
|
||||
"kind": "let"
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/typescript/types/literal-string-2/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/typescript/types/literal-string-2/input.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
let x: `foo-${bar}`;
|
||||
7
packages/babel-parser/test/fixtures/typescript/types/literal-string-2/options.json
vendored
Normal file
7
packages/babel-parser/test/fixtures/typescript/types/literal-string-2/options.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"sourceType": "module",
|
||||
"plugins": [
|
||||
"typescript"
|
||||
],
|
||||
"throws": "Template literal types cannot have any substitution (1:14)"
|
||||
}
|
||||
Reference in New Issue
Block a user