From dd5e24eabeab1f75ad573c79781e5fd408bcfad3 Mon Sep 17 00:00:00 2001 From: Konv Suu Date: Tue, 14 Jul 2026 17:33:39 +0800 Subject: [PATCH] Preserve quotes for `TSMethodSignature` nodes named `new` (#19621) --- changelog_unreleased/typescript/19621.md | 19 ++++ src/language-js/print/key.js | 4 + .../__snapshots__/format.test.js.snap | 90 +++++++++++++++++++ .../typescript/quote-props/issue-19618.ts | 9 ++ 4 files changed, 122 insertions(+) create mode 100644 changelog_unreleased/typescript/19621.md create mode 100644 tests/format/typescript/quote-props/issue-19618.ts diff --git a/changelog_unreleased/typescript/19621.md b/changelog_unreleased/typescript/19621.md new file mode 100644 index 000000000..912283777 --- /dev/null +++ b/changelog_unreleased/typescript/19621.md @@ -0,0 +1,19 @@ +#### Preserve quotes for methods named `new` (#19621 by @kovsu) + + +```tsx +// Input +interface Container { + "new"(id: string): number; +} + +// Prettier stable +interface Container { + new(id: string): number; +} + +// Prettier main +interface Container { + "new"(id: string): number; +} +``` diff --git a/src/language-js/print/key.js b/src/language-js/print/key.js index 06d6576b3..d7220523f 100644 --- a/src/language-js/print/key.js +++ b/src/language-js/print/key.js @@ -99,6 +99,10 @@ function isKeySafeToUnquote(node, options) { return false; } + if (node.type === "TSMethodSignature" && value === "new") { + return false; + } + // Safe to unquote as identifier if ( // With `--strictPropertyInitialization`, TS treats properties with quoted names differently than unquoted ones. diff --git a/tests/format/typescript/quote-props/__snapshots__/format.test.js.snap b/tests/format/typescript/quote-props/__snapshots__/format.test.js.snap index c16f0e764..c7a81ca3f 100644 --- a/tests/format/typescript/quote-props/__snapshots__/format.test.js.snap +++ b/tests/format/typescript/quote-props/__snapshots__/format.test.js.snap @@ -240,6 +240,96 @@ interface I2 { ================================================================================ `; +exports[`issue-19618.ts - {"quoteProps":"as-needed"} format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +quoteProps: "as-needed" + printWidth: 80 (default) | +=====================================input====================================== +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + 'new'(id: string): number; + 'method'(): void; +}; + +=====================================output===================================== +interface Container { + "new"(id: string): number; + method(): void; +} + +type ContainerType = { + "new"(id: string): number; + method(): void; +}; + +================================================================================ +`; + +exports[`issue-19618.ts - {"quoteProps":"consistent"} format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +quoteProps: "consistent" + printWidth: 80 (default) | +=====================================input====================================== +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + 'new'(id: string): number; + 'method'(): void; +}; + +=====================================output===================================== +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + "new"(id: string): number; + "method"(): void; +}; + +================================================================================ +`; + +exports[`issue-19618.ts - {"quoteProps":"preserve"} format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +quoteProps: "preserve" + printWidth: 80 (default) | +=====================================input====================================== +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + 'new'(id: string): number; + 'method'(): void; +}; + +=====================================output===================================== +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + "new"(id: string): number; + "method"(): void; +}; + +================================================================================ +`; + exports[`type-literal.ts - {"quoteProps":"as-needed"} format 1`] = ` ====================================options===================================== parsers: ["typescript"] diff --git a/tests/format/typescript/quote-props/issue-19618.ts b/tests/format/typescript/quote-props/issue-19618.ts new file mode 100644 index 000000000..c0b71e365 --- /dev/null +++ b/tests/format/typescript/quote-props/issue-19618.ts @@ -0,0 +1,9 @@ +interface Container { + "new"(id: string): number; + "method"(): void; +} + +type ContainerType = { + 'new'(id: string): number; + 'method'(): void; +};