TypeScript 4.0: Support labeled tuple elements (#11754)

* TypeScript 4.0: Support labeled tuple elements

* More tests

* Disallow mixing labeled and unlabeled elements

* Update AST shape

* Enable test after rebase

* Allow labeled spread types

* Fix flow

* Add types and generator suport

* Update packages/babel-parser/src/plugins/typescript/index.js

* Prettier
This commit is contained in:
Nicolò Ribaudo
2020-07-15 00:23:09 +02:00
committed by Huáng Jùnliàng
parent 9e6663f125
commit eba4c3b6ed
31 changed files with 736 additions and 17 deletions

View File

@@ -923,6 +923,12 @@ export function assertTSOptionalType(node: Object, opts?: Object = {}): void {
export function assertTSRestType(node: Object, opts?: Object = {}): void {
assert("TSRestType", node, opts);
}
export function assertTSNamedTupleMember(
node: Object,
opts?: Object = {},
): void {
assert("TSNamedTupleMember", node, opts);
}
export function assertTSUnionType(node: Object, opts?: Object = {}): void {
assert("TSUnionType", node, opts);
}

View File

@@ -894,6 +894,11 @@ export function tsRestType(...args: Array<any>): Object {
}
export { tsRestType as TSRestType };
export { tsRestType as tSRestType };
export function tsNamedTupleMember(...args: Array<any>): Object {
return builder("TSNamedTupleMember", ...args);
}
export { tsNamedTupleMember as TSNamedTupleMember };
export { tsNamedTupleMember as tSNamedTupleMember };
export function tsUnionType(...args: Array<any>): Object {
return builder("TSUnionType", ...args);
}

View File

@@ -214,7 +214,7 @@ defineType("TSTupleType", {
aliases: ["TSType"],
visitor: ["elementTypes"],
fields: {
elementTypes: validateArrayOfType("TSType"),
elementTypes: validateArrayOfType(["TSType", "TSNamedTupleMember"]),
},
});
@@ -234,6 +234,19 @@ defineType("TSRestType", {
},
});
defineType("TSNamedTupleMember", {
visitor: ["label", "elementType"],
builder: ["label", "elementType", "optional"],
fields: {
label: validateType("Identifier"),
optional: {
validate: bool,
default: false,
},
elementType: validateType("TSType"),
},
});
const unionOrIntersection = {
aliases: ["TSType"],
visitor: ["types"],

View File

@@ -3041,6 +3041,20 @@ export function isTSRestType(node: ?Object, opts?: Object): boolean {
return false;
}
export function isTSNamedTupleMember(node: ?Object, opts?: Object): boolean {
if (!node) return false;
const nodeType = node.type;
if (nodeType === "TSNamedTupleMember") {
if (typeof opts === "undefined") {
return true;
} else {
return shallowEqual(node, opts);
}
}
return false;
}
export function isTSUnionType(node: ?Object, opts?: Object): boolean {
if (!node) return false;