Skip to content

Commit 1f43c8d

Browse files
committed
Remove missing type from tuple type arguments under exactOptionalPropertyTypes
1 parent d95caa5 commit 1f43c8d

12 files changed

+299
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15217,7 +15217,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1521715217
const typeArguments = !node ? emptyArray :
1521815218
node.kind === SyntaxKind.TypeReference ? concatenate(type.target.outerTypeParameters, getEffectiveTypeArguments(node, type.target.localTypeParameters!)) :
1521915219
node.kind === SyntaxKind.ArrayType ? [getTypeFromTypeNode(node.elementType)] :
15220-
map(node.elements, getTypeFromTypeNode);
15220+
map(node.elements, element => removeMissingType(getTypeFromTypeNode(element), element.kind === SyntaxKind.OptionalType));
1522115221
if (popTypeResolution()) {
1522215222
type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
1522315223
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
forOfOptionalTupleMember.ts(12,3): error TS18048: 'item' is possibly 'undefined'.
2+
3+
4+
==== forOfOptionalTupleMember.ts (1 errors) ====
5+
// repro from https://github.com/microsoft/TypeScript/issues/54302
6+
7+
type Item = {
8+
value: string;
9+
};
10+
11+
type Foo = [Item?];
12+
13+
declare const foo: Foo;
14+
15+
for (let item of foo) {
16+
item.value;
17+
~~~~
18+
!!! error TS18048: 'item' is possibly 'undefined'.
19+
}
20+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
8+
9+
value: string;
10+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
16+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
17+
18+
declare const foo: Foo;
19+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
20+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
21+
22+
for (let item of foo) {
23+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
24+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
25+
26+
item.value;
27+
>item.value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
28+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
29+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
30+
}
31+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : { value: string; }
8+
9+
value: string;
10+
>value : string
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : [(Item | undefined)?]
16+
17+
declare const foo: Foo;
18+
>foo : Foo
19+
20+
for (let item of foo) {
21+
>item : Item | undefined
22+
>foo : Foo
23+
24+
item.value;
25+
>item.value : string
26+
>item : Item | undefined
27+
>value : string
28+
}
29+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
forOfOptionalTupleMember.ts(12,3): error TS18048: 'item' is possibly 'undefined'.
2+
3+
4+
==== forOfOptionalTupleMember.ts (1 errors) ====
5+
// repro from https://github.com/microsoft/TypeScript/issues/54302
6+
7+
type Item = {
8+
value: string;
9+
};
10+
11+
type Foo = [Item?];
12+
13+
declare const foo: Foo;
14+
15+
for (let item of foo) {
16+
item.value;
17+
~~~~
18+
!!! error TS18048: 'item' is possibly 'undefined'.
19+
}
20+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
8+
9+
value: string;
10+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
16+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
17+
18+
declare const foo: Foo;
19+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
20+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
21+
22+
for (let item of foo) {
23+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
24+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
25+
26+
item.value;
27+
>item.value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
28+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
29+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
30+
}
31+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : { value: string; }
8+
9+
value: string;
10+
>value : string
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : [(Item | undefined)?]
16+
17+
declare const foo: Foo;
18+
>foo : Foo
19+
20+
for (let item of foo) {
21+
>item : Item | undefined
22+
>foo : Foo
23+
24+
item.value;
25+
>item.value : string
26+
>item : Item | undefined
27+
>value : string
28+
}
29+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
8+
9+
value: string;
10+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
16+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
17+
18+
declare const foo: Foo;
19+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
20+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
21+
22+
for (let item of foo) {
23+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
24+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
25+
26+
item.value;
27+
>item.value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
28+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
29+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
30+
}
31+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : { value: string; }
8+
9+
value: string;
10+
>value : string
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : [Item?]
16+
17+
declare const foo: Foo;
18+
>foo : Foo
19+
20+
for (let item of foo) {
21+
>item : Item
22+
>foo : Foo
23+
24+
item.value;
25+
>item.value : string
26+
>item : Item
27+
>value : string
28+
}
29+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [tests/cases/compiler/forOfOptionalTupleMember.ts] ////
2+
3+
=== forOfOptionalTupleMember.ts ===
4+
// repro from https://github.com/microsoft/TypeScript/issues/54302
5+
6+
type Item = {
7+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
8+
9+
value: string;
10+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
11+
12+
};
13+
14+
type Foo = [Item?];
15+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
16+
>Item : Symbol(Item, Decl(forOfOptionalTupleMember.ts, 0, 0))
17+
18+
declare const foo: Foo;
19+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
20+
>Foo : Symbol(Foo, Decl(forOfOptionalTupleMember.ts, 4, 2))
21+
22+
for (let item of foo) {
23+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
24+
>foo : Symbol(foo, Decl(forOfOptionalTupleMember.ts, 8, 13))
25+
26+
item.value;
27+
>item.value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
28+
>item : Symbol(item, Decl(forOfOptionalTupleMember.ts, 10, 8))
29+
>value : Symbol(value, Decl(forOfOptionalTupleMember.ts, 2, 13))
30+
}
31+

0 commit comments

Comments
 (0)