From 204f9aa4d1d30abc2de03edaa0fd63bbe1c51134 Mon Sep 17 00:00:00 2001 From: fisker Date: Tue, 25 Aug 2020 12:34:32 +0800 Subject: [PATCH] Remove parens around `TSInferType` --- changelog_unreleased/typescript/pr-9044.md | 13 ++++++++++ src/language-js/needs-parens.js | 6 ++++- .../__snapshots__/jsfmt.spec.js.snap | 25 +++++++++++++++++++ tests/typescript/rest-type/infer-type.ts | 5 ++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 changelog_unreleased/typescript/pr-9044.md create mode 100644 tests/typescript/rest-type/infer-type.ts diff --git a/changelog_unreleased/typescript/pr-9044.md b/changelog_unreleased/typescript/pr-9044.md new file mode 100644 index 000000000000..11d4399737f4 --- /dev/null +++ b/changelog_unreleased/typescript/pr-9044.md @@ -0,0 +1,13 @@ +#### Remove parens around `TSInferType` ([#9044](https://github.com/prettier/prettier/pull/9044) by [@fisker](https://github.com/fisker)) + + +```typescript +// Input +type Tail = T extends [infer U, ...infer R] ? R : never; + +// Prettier stable +type Tail = T extends [infer U, ...(infer R)] ? R : never; + +// Prettier master +type Tail = T extends [infer U, ...infer R] ? R : never; +``` diff --git a/src/language-js/needs-parens.js b/src/language-js/needs-parens.js index f9568168d6ba..b740e2b1afb0 100644 --- a/src/language-js/needs-parens.js +++ b/src/language-js/needs-parens.js @@ -417,8 +417,12 @@ function needsParens(path, options) { return true; } // fallthrough - case "TSTypeOperator": case "TSInferType": + if (node.type === "TSInferType" && parent.type === "TSRestType") { + return false; + } + // fallthrough + case "TSTypeOperator": return ( parent.type === "TSArrayType" || parent.type === "TSOptionalType" || diff --git a/tests/typescript/rest-type/__snapshots__/jsfmt.spec.js.snap b/tests/typescript/rest-type/__snapshots__/jsfmt.spec.js.snap index c45419e9c6ef..9c3a39999737 100644 --- a/tests/typescript/rest-type/__snapshots__/jsfmt.spec.js.snap +++ b/tests/typescript/rest-type/__snapshots__/jsfmt.spec.js.snap @@ -14,6 +14,31 @@ type TupleWithRest = [number, ...(1 extends 2 ? string[] : number[])]; ================================================================================ `; +exports[`infer-type.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +type Tail = T extends [infer U, ...infer R] ? R : never; + +type ReduceNextElement< + T extends readonly unknown[] +> = T extends readonly [infer V, ...infer R] ? [V, R] : never + +=====================================output===================================== +type Tail = T extends [infer U, ...infer R] ? R : never; + +type ReduceNextElement = T extends readonly [ + infer V, + ...infer R +] + ? [V, R] + : never; + +================================================================================ +`; + exports[`simple.ts format 1`] = ` ====================================options===================================== parsers: ["typescript"] diff --git a/tests/typescript/rest-type/infer-type.ts b/tests/typescript/rest-type/infer-type.ts new file mode 100644 index 000000000000..3829b96b382d --- /dev/null +++ b/tests/typescript/rest-type/infer-type.ts @@ -0,0 +1,5 @@ +type Tail = T extends [infer U, ...infer R] ? R : never; + +type ReduceNextElement< + T extends readonly unknown[] +> = T extends readonly [infer V, ...infer R] ? [V, R] : never