Skip to content

Commit 8890dcb

Browse files
TypeScript Botweswigham
TypeScript Bot
andauthored
Cherry-pick PR #40118 into release-4.0 (#40134)
Component commits: e1f4f9c Fix tuple name homogeneity check Co-authored-by: Wesley Wigham <[email protected]>
1 parent 912cbdf commit 8890dcb

File tree

6 files changed

+63
-27
lines changed

6 files changed

+63
-27
lines changed

src/compiler/checker.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -31041,13 +31041,10 @@ namespace ts {
3104131041
function checkTupleType(node: TupleTypeNode) {
3104231042
const elementTypes = node.elements;
3104331043
let seenOptionalElement = false;
31044-
let seenNamedElement = false;
31044+
const hasNamedElement = some(elementTypes, isNamedTupleMember);
3104531045
for (let i = 0; i < elementTypes.length; i++) {
3104631046
const e = elementTypes[i];
31047-
if (e.kind === SyntaxKind.NamedTupleMember) {
31048-
seenNamedElement = true;
31049-
}
31050-
else if (seenNamedElement) {
31047+
if (e.kind !== SyntaxKind.NamedTupleMember && hasNamedElement) {
3105131048
grammarErrorOnNode(e, Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names);
3105231049
break;
3105331050
}

tests/baselines/reference/namedTupleMembersErrors.errors.txt

+23-11
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
11
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(1,41): error TS5084: Tuple members must all have names or all not have names.
2-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(3,32): error TS5084: Tuple members must all have names or all not have names.
3-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(5,32): error TS5084: Tuple members must all have names or all not have names.
4-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(7,29): error TS5086: A labeled tuple element is declared as optional with a question mark after the name and before the colon, rather than after the type.
5-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(9,46): error TS5087: A labeled tuple element is declared as rest with a `...` before the name, rather than before the type.
6-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(11,49): error TS5087: A labeled tuple element is declared as rest with a `...` before the name, rather than before the type.
7-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(11,52): error TS8020: JSDoc types can only be used inside documentation comments.
8-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(13,39): error TS5085: A tuple member cannot be both optional and rest.
9-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(15,44): error TS2574: A rest element type must be an array type.
10-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(17,13): error TS2456: Type alias 'RecusiveRestUnlabeled' circularly references itself.
11-
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(18,13): error TS2456: Type alias 'RecusiveRest' circularly references itself.
2+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(2,25): error TS5084: Tuple members must all have names or all not have names.
3+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(4,32): error TS5084: Tuple members must all have names or all not have names.
4+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(5,22): error TS5084: Tuple members must all have names or all not have names.
5+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(7,32): error TS5084: Tuple members must all have names or all not have names.
6+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(8,22): error TS5084: Tuple members must all have names or all not have names.
7+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(10,29): error TS5086: A labeled tuple element is declared as optional with a question mark after the name and before the colon, rather than after the type.
8+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(12,46): error TS5087: A labeled tuple element is declared as rest with a `...` before the name, rather than before the type.
9+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(14,49): error TS5087: A labeled tuple element is declared as rest with a `...` before the name, rather than before the type.
10+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(14,52): error TS8020: JSDoc types can only be used inside documentation comments.
11+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(16,39): error TS5085: A tuple member cannot be both optional and rest.
12+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(18,44): error TS2574: A rest element type must be an array type.
13+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(20,13): error TS2456: Type alias 'RecusiveRestUnlabeled' circularly references itself.
14+
tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts(21,13): error TS2456: Type alias 'RecusiveRest' circularly references itself.
1215

1316

14-
==== tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts (11 errors) ====
17+
==== tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts (14 errors) ====
1518
export type Segment1 = [length: number, number]; // partially named, disallowed
1619
~~~~~~
1720
!!! error TS5084: Tuple members must all have names or all not have names.
21+
export type Segment2 = [number, size: number]; // partially named, disallowed
22+
~~~~~~
23+
!!! error TS5084: Tuple members must all have names or all not have names.
1824

1925
export type List = [item: any, ...any]; // partially named, disallowed
2026
~~~~~~
2127
!!! error TS5084: Tuple members must all have names or all not have names.
28+
export type List2 = [any, ...remainder: any]; // partially named, disallowed
29+
~~~
30+
!!! error TS5084: Tuple members must all have names or all not have names.
2231

2332
export type Pair = [item: any, any?]; // partially named, disallowed
2433
~~~~
2534
!!! error TS5084: Tuple members must all have names or all not have names.
35+
export type Pair2 = [any, last?: any]; // partially named, disallowed
36+
~~~
37+
!!! error TS5084: Tuple members must all have names or all not have names.
2638

2739
export type Opt = [element: string?]; // question mark on element disallowed
2840
~~~~~~~

tests/baselines/reference/namedTupleMembersErrors.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
//// [namedTupleMembersErrors.ts]
22
export type Segment1 = [length: number, number]; // partially named, disallowed
3+
export type Segment2 = [number, size: number]; // partially named, disallowed
34

45
export type List = [item: any, ...any]; // partially named, disallowed
6+
export type List2 = [any, ...remainder: any]; // partially named, disallowed
57

68
export type Pair = [item: any, any?]; // partially named, disallowed
9+
export type Pair2 = [any, last?: any]; // partially named, disallowed
710

811
export type Opt = [element: string?]; // question mark on element disallowed
912

@@ -26,8 +29,11 @@ exports.__esModule = true;
2629

2730
//// [namedTupleMembersErrors.d.ts]
2831
export declare type Segment1 = [length: number, number];
32+
export declare type Segment2 = [number, size: number];
2933
export declare type List = [item: any, ...any];
34+
export declare type List2 = [any, ...remainder: any];
3035
export declare type Pair = [item: any, any?];
36+
export declare type Pair2 = [any, last?: any];
3137
export declare type Opt = [element: string?];
3238
export declare type Trailing = [first: string, rest: ...string[]];
3339
export declare type OptTrailing = [first: string, rest: ...?string[]];

tests/baselines/reference/namedTupleMembersErrors.symbols

+20-11
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,41 @@
22
export type Segment1 = [length: number, number]; // partially named, disallowed
33
>Segment1 : Symbol(Segment1, Decl(namedTupleMembersErrors.ts, 0, 0))
44

5+
export type Segment2 = [number, size: number]; // partially named, disallowed
6+
>Segment2 : Symbol(Segment2, Decl(namedTupleMembersErrors.ts, 0, 48))
7+
58
export type List = [item: any, ...any]; // partially named, disallowed
6-
>List : Symbol(List, Decl(namedTupleMembersErrors.ts, 0, 48))
9+
>List : Symbol(List, Decl(namedTupleMembersErrors.ts, 1, 46))
10+
11+
export type List2 = [any, ...remainder: any]; // partially named, disallowed
12+
>List2 : Symbol(List2, Decl(namedTupleMembersErrors.ts, 3, 39))
713

814
export type Pair = [item: any, any?]; // partially named, disallowed
9-
>Pair : Symbol(Pair, Decl(namedTupleMembersErrors.ts, 2, 39))
15+
>Pair : Symbol(Pair, Decl(namedTupleMembersErrors.ts, 4, 45))
16+
17+
export type Pair2 = [any, last?: any]; // partially named, disallowed
18+
>Pair2 : Symbol(Pair2, Decl(namedTupleMembersErrors.ts, 6, 37))
1019

1120
export type Opt = [element: string?]; // question mark on element disallowed
12-
>Opt : Symbol(Opt, Decl(namedTupleMembersErrors.ts, 4, 37))
21+
>Opt : Symbol(Opt, Decl(namedTupleMembersErrors.ts, 7, 38))
1322

1423
export type Trailing = [first: string, rest: ...string[]]; // dots on element disallowed
15-
>Trailing : Symbol(Trailing, Decl(namedTupleMembersErrors.ts, 6, 37))
24+
>Trailing : Symbol(Trailing, Decl(namedTupleMembersErrors.ts, 9, 37))
1625

1726
export type OptTrailing = [first: string, rest: ...string[]?]; // dots+question on element disallowed
18-
>OptTrailing : Symbol(OptTrailing, Decl(namedTupleMembersErrors.ts, 8, 58))
27+
>OptTrailing : Symbol(OptTrailing, Decl(namedTupleMembersErrors.ts, 11, 58))
1928

2029
export type OptRest = [first: string, ...rest?: string[]]; // rest+optional disallowed
21-
>OptRest : Symbol(OptRest, Decl(namedTupleMembersErrors.ts, 10, 62))
30+
>OptRest : Symbol(OptRest, Decl(namedTupleMembersErrors.ts, 13, 62))
2231

2332
export type NonArrayRest = [first: string, ...rest: number]; // non-arraylike rest, disallowed
24-
>NonArrayRest : Symbol(NonArrayRest, Decl(namedTupleMembersErrors.ts, 12, 58))
33+
>NonArrayRest : Symbol(NonArrayRest, Decl(namedTupleMembersErrors.ts, 15, 58))
2534

2635
export type RecusiveRestUnlabeled = [string, ...RecusiveRestUnlabeled];
27-
>RecusiveRestUnlabeled : Symbol(RecusiveRestUnlabeled, Decl(namedTupleMembersErrors.ts, 14, 60))
28-
>RecusiveRestUnlabeled : Symbol(RecusiveRestUnlabeled, Decl(namedTupleMembersErrors.ts, 14, 60))
36+
>RecusiveRestUnlabeled : Symbol(RecusiveRestUnlabeled, Decl(namedTupleMembersErrors.ts, 17, 60))
37+
>RecusiveRestUnlabeled : Symbol(RecusiveRestUnlabeled, Decl(namedTupleMembersErrors.ts, 17, 60))
2938

3039
export type RecusiveRest = [first: string, ...rest: RecusiveRest]; // marked as incorrect, same as above
31-
>RecusiveRest : Symbol(RecusiveRest, Decl(namedTupleMembersErrors.ts, 16, 71))
32-
>RecusiveRest : Symbol(RecusiveRest, Decl(namedTupleMembersErrors.ts, 16, 71))
40+
>RecusiveRest : Symbol(RecusiveRest, Decl(namedTupleMembersErrors.ts, 19, 71))
41+
>RecusiveRest : Symbol(RecusiveRest, Decl(namedTupleMembersErrors.ts, 19, 71))
3342

tests/baselines/reference/namedTupleMembersErrors.types

+9
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,21 @@
22
export type Segment1 = [length: number, number]; // partially named, disallowed
33
>Segment1 : Segment1
44

5+
export type Segment2 = [number, size: number]; // partially named, disallowed
6+
>Segment2 : Segment2
7+
58
export type List = [item: any, ...any]; // partially named, disallowed
69
>List : [any, ...any[]]
710

11+
export type List2 = [any, ...remainder: any]; // partially named, disallowed
12+
>List2 : [any, ...any[]]
13+
814
export type Pair = [item: any, any?]; // partially named, disallowed
915
>Pair : Pair
1016

17+
export type Pair2 = [any, last?: any]; // partially named, disallowed
18+
>Pair2 : Pair2
19+
1120
export type Opt = [element: string?]; // question mark on element disallowed
1221
>Opt : Opt
1322

tests/cases/conformance/types/tuple/named/namedTupleMembersErrors.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// @declaration: true
22

33
export type Segment1 = [length: number, number]; // partially named, disallowed
4+
export type Segment2 = [number, size: number]; // partially named, disallowed
45

56
export type List = [item: any, ...any]; // partially named, disallowed
7+
export type List2 = [any, ...remainder: any]; // partially named, disallowed
68

79
export type Pair = [item: any, any?]; // partially named, disallowed
10+
export type Pair2 = [any, last?: any]; // partially named, disallowed
811

912
export type Opt = [element: string?]; // question mark on element disallowed
1013

0 commit comments

Comments
 (0)