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 typemaster
parent
9c608d2ec1
commit
e8f12cf621
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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":
|
||||
|
|
|
@ -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 = [];
|
||||
|
|
|
@ -50,7 +50,7 @@ type AwkwardlyLongFunctionTypeDefinition = <
|
|||
arg1: GenericTypeNumberOne,
|
||||
arg2: GenericTypeNumberTwo,
|
||||
arg3: GenericTypeNumberThree
|
||||
) => (GenericTypeNumberOne | GenericTypeNumberTwo | GenericTypeNumberThree);
|
||||
) => GenericTypeNumberOne | GenericTypeNumberTwo | GenericTypeNumberThree;
|
||||
|
||||
`;
|
||||
|
||||
|
|
|
@ -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>;
|
||||
}
|
||||
|
||||
`;
|
||||
|
|
|
@ -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)>;
|
||||
}
|
Loading…
Reference in New Issue