Skip to content

Commit 6175e60

Browse files
authored
Formatting a union should not create a 1-element union type node (#27582)
1 parent 9ad95ef commit 6175e60

5 files changed

+80
-0
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3307,6 +3307,9 @@ namespace ts {
33073307
}
33083308
if (type.flags & (TypeFlags.Union | TypeFlags.Intersection)) {
33093309
const types = type.flags & TypeFlags.Union ? formatUnionTypes((<UnionType>type).types) : (<IntersectionType>type).types;
3310+
if (length(types) === 1) {
3311+
return typeToTypeNodeHelper(types[0], context);
3312+
}
33103313
const typeNodes = mapToTypeNodes(types, context, /*isBareList*/ true);
33113314
if (typeNodes && typeNodes.length > 0) {
33123315
const unionOrIntersectionTypeNode = createUnionOrIntersectionTypeNode(type.flags & TypeFlags.Union ? SyntaxKind.UnionType : SyntaxKind.IntersectionType, typeNodes);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [declarationEmitNoNonRequiredParens.ts]
2+
export enum Test {
3+
A, B, C
4+
}
5+
6+
export type TestType = typeof Test;
7+
8+
export const bar = (null as TestType[Extract<keyof TestType, string>][]);
9+
10+
//// [declarationEmitNoNonRequiredParens.js]
11+
"use strict";
12+
exports.__esModule = true;
13+
var Test;
14+
(function (Test) {
15+
Test[Test["A"] = 0] = "A";
16+
Test[Test["B"] = 1] = "B";
17+
Test[Test["C"] = 2] = "C";
18+
})(Test = exports.Test || (exports.Test = {}));
19+
exports.bar = null;
20+
21+
22+
//// [declarationEmitNoNonRequiredParens.d.ts]
23+
export declare enum Test {
24+
A = 0,
25+
B = 1,
26+
C = 2
27+
}
28+
export declare type TestType = typeof Test;
29+
export declare const bar: Test[];
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/declarationEmitNoNonRequiredParens.ts ===
2+
export enum Test {
3+
>Test : Symbol(Test, Decl(declarationEmitNoNonRequiredParens.ts, 0, 0))
4+
5+
A, B, C
6+
>A : Symbol(Test.A, Decl(declarationEmitNoNonRequiredParens.ts, 0, 18))
7+
>B : Symbol(Test.B, Decl(declarationEmitNoNonRequiredParens.ts, 1, 6))
8+
>C : Symbol(Test.C, Decl(declarationEmitNoNonRequiredParens.ts, 1, 9))
9+
}
10+
11+
export type TestType = typeof Test;
12+
>TestType : Symbol(TestType, Decl(declarationEmitNoNonRequiredParens.ts, 2, 1))
13+
>Test : Symbol(Test, Decl(declarationEmitNoNonRequiredParens.ts, 0, 0))
14+
15+
export const bar = (null as TestType[Extract<keyof TestType, string>][]);
16+
>bar : Symbol(bar, Decl(declarationEmitNoNonRequiredParens.ts, 6, 12))
17+
>TestType : Symbol(TestType, Decl(declarationEmitNoNonRequiredParens.ts, 2, 1))
18+
>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --))
19+
>TestType : Symbol(TestType, Decl(declarationEmitNoNonRequiredParens.ts, 2, 1))
20+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/declarationEmitNoNonRequiredParens.ts ===
2+
export enum Test {
3+
>Test : Test
4+
5+
A, B, C
6+
>A : Test.A
7+
>B : Test.B
8+
>C : Test.C
9+
}
10+
11+
export type TestType = typeof Test;
12+
>TestType : typeof Test
13+
>Test : typeof Test
14+
15+
export const bar = (null as TestType[Extract<keyof TestType, string>][]);
16+
>bar : Test[]
17+
>(null as TestType[Extract<keyof TestType, string>][]) : Test[]
18+
>null as TestType[Extract<keyof TestType, string>][] : Test[]
19+
>null : null
20+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @declaration: true
2+
export enum Test {
3+
A, B, C
4+
}
5+
6+
export type TestType = typeof Test;
7+
8+
export const bar = (null as TestType[Extract<keyof TestType, string>][]);

0 commit comments

Comments
 (0)