TypeScript: Remove parens from type annotations where possible (#2098)

* fix(typescript): remove parens from union types where possible, fixes #1885

* fix(typescript): ensure parenthesis removal is stable

* fix(typescript): don't strip parens around function type
master
Lucas Azzola 2017-06-12 11:06:47 +10:00 committed by Christopher Chedeau
parent 9c608d2ec1
commit e8f12cf621
6 changed files with 121 additions and 6 deletions

View File

@ -98,11 +98,10 @@ function massageAST(ast) {
delete newObj.specifiers;
}
// (TypeScript) allow parenthesization of TSFunctionType
// (TypeScript) bypass TSParenthesizedType
if (
ast.type === "TSParenthesizedType" &&
ast.typeAnnotation.type === "TypeAnnotation" &&
ast.typeAnnotation.typeAnnotation.type === "TSFunctionType"
ast.typeAnnotation.type === "TypeAnnotation"
) {
return newObj.typeAnnotation.typeAnnotation;
}

View File

@ -343,6 +343,23 @@ FastPath.prototype.needsParens = function() {
return false;
}
case "TSParenthesizedType": {
if (
(parent.type === "VariableDeclarator" ||
parent.type === "TypeAnnotation" ||
parent.type === "GenericTypeAnnotation") &&
(node.typeAnnotation.type === "TypeAnnotation" &&
node.typeAnnotation.typeAnnotation.type !== "TSFunctionType")
) {
return false;
}
// Delegate to inner TSParenthesizedType
if (node.typeAnnotation.type === "TSParenthesizedType") {
return false;
}
return true;
}
case "SequenceExpression":
switch (parent.type) {
case "ReturnStatement":

View File

@ -2353,8 +2353,9 @@ function genericPrintNoParens(path, options, print, args) {
]);
case "TSTypeQuery":
return concat(["typeof ", path.call(print, "exprName")]);
case "TSParenthesizedType":
return concat(["(", path.call(print, "typeAnnotation"), ")"]);
case "TSParenthesizedType": {
return path.call(print, "typeAnnotation");
}
case "TSIndexSignature": {
const parent = path.getParentNode();
let printedParams = [];

View File

@ -50,7 +50,7 @@ type AwkwardlyLongFunctionTypeDefinition = <
arg1: GenericTypeNumberOne,
arg2: GenericTypeNumberTwo,
arg3: GenericTypeNumberThree
) => (GenericTypeNumberOne | GenericTypeNumberTwo | GenericTypeNumberThree);
) => GenericTypeNumberOne | GenericTypeNumberTwo | GenericTypeNumberThree;
`;

View File

@ -68,3 +68,69 @@ type window = Window & {
};
`;
exports[`union-parens.ts 1`] = `
export type A = (
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
);
export type B = (
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
);
export type C =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type D =
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type Multi = (string | number)[];
function f(): (string | number) {}
var x: (string | number);
var y: ((string | number));
class Foo<T extends (string | number)> {}
interface Interface {
i: (X | Y) & Z;
j: Partial<(X | Y)>;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
export type A =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type B =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type C =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type D =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type Multi = (string | number)[];
function f(): string | number {}
var x: string | number;
var y: string | number;
class Foo<T extends string | number> {}
interface Interface {
i: (X | Y) & Z;
j: Partial<X | Y>;
}
`;

View File

@ -0,0 +1,32 @@
export type A = (
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
);
export type B = (
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
);
export type C =
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
| bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type D =
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
export type Multi = (string | number)[];
function f(): (string | number) {}
var x: (string | number);
var y: ((string | number));
class Foo<T extends (string | number)> {}
interface Interface {
i: (X | Y) & Z;
j: Partial<(X | Y)>;
}