Skip to content

Commit fc756eb

Browse files
authored
Use missingType instead of undefinedType for optional methods under exactOptionalPropertyTypes (#52519)
1 parent dcc766f commit fc756eb

6 files changed

+148
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11359,7 +11359,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1135911359
return baseTypeVariable ? getIntersectionType([type, baseTypeVariable]) : type;
1136011360
}
1136111361
else {
11362-
return strictNullChecks && symbol.flags & SymbolFlags.Optional ? getOptionalType(type) : type;
11362+
return strictNullChecks && symbol.flags & SymbolFlags.Optional ? getOptionalType(type, /*isProperty*/ true) : type;
1136311363
}
1136411364
}
1136511365

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/compiler/stripMembersOptionality.ts ===
2+
// repro from #52494
3+
4+
declare const someVal: Required<{
5+
>someVal : Symbol(someVal, Decl(stripMembersOptionality.ts, 2, 13))
6+
>Required : Symbol(Required, Decl(lib.es5.d.ts, --, --))
7+
8+
fn?(key: string): string | null;
9+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
10+
>key : Symbol(key, Decl(stripMembersOptionality.ts, 3, 8))
11+
12+
}>;
13+
someVal.fn("");
14+
>someVal.fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
15+
>someVal : Symbol(someVal, Decl(stripMembersOptionality.ts, 2, 13))
16+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
17+
18+
declare const someVal2: Required<{
19+
>someVal2 : Symbol(someVal2, Decl(stripMembersOptionality.ts, 7, 13))
20+
>Required : Symbol(Required, Decl(lib.es5.d.ts, --, --))
21+
22+
fn?: (key: string) => string | null;
23+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
24+
>key : Symbol(key, Decl(stripMembersOptionality.ts, 8, 10))
25+
26+
}>;
27+
someVal2.fn("");
28+
>someVal2.fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
29+
>someVal2 : Symbol(someVal2, Decl(stripMembersOptionality.ts, 7, 13))
30+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
31+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/stripMembersOptionality.ts ===
2+
// repro from #52494
3+
4+
declare const someVal: Required<{
5+
>someVal : Required<{ fn?(key: string): string | null; }>
6+
7+
fn?(key: string): string | null;
8+
>fn : ((key: string) => string | null) | undefined
9+
>key : string
10+
>null : null
11+
12+
}>;
13+
someVal.fn("");
14+
>someVal.fn("") : string | null
15+
>someVal.fn : (key: string) => string | null
16+
>someVal : Required<{ fn?(key: string): string | null; }>
17+
>fn : (key: string) => string | null
18+
>"" : ""
19+
20+
declare const someVal2: Required<{
21+
>someVal2 : Required<{ fn?: ((key: string) => string | null) | undefined; }>
22+
23+
fn?: (key: string) => string | null;
24+
>fn : ((key: string) => string | null) | undefined
25+
>key : string
26+
>null : null
27+
28+
}>;
29+
someVal2.fn("");
30+
>someVal2.fn("") : string | null
31+
>someVal2.fn : (key: string) => string | null
32+
>someVal2 : Required<{ fn?: ((key: string) => string | null) | undefined; }>
33+
>fn : (key: string) => string | null
34+
>"" : ""
35+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/compiler/stripMembersOptionality.ts ===
2+
// repro from #52494
3+
4+
declare const someVal: Required<{
5+
>someVal : Symbol(someVal, Decl(stripMembersOptionality.ts, 2, 13))
6+
>Required : Symbol(Required, Decl(lib.es5.d.ts, --, --))
7+
8+
fn?(key: string): string | null;
9+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
10+
>key : Symbol(key, Decl(stripMembersOptionality.ts, 3, 8))
11+
12+
}>;
13+
someVal.fn("");
14+
>someVal.fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
15+
>someVal : Symbol(someVal, Decl(stripMembersOptionality.ts, 2, 13))
16+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 2, 33))
17+
18+
declare const someVal2: Required<{
19+
>someVal2 : Symbol(someVal2, Decl(stripMembersOptionality.ts, 7, 13))
20+
>Required : Symbol(Required, Decl(lib.es5.d.ts, --, --))
21+
22+
fn?: (key: string) => string | null;
23+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
24+
>key : Symbol(key, Decl(stripMembersOptionality.ts, 8, 10))
25+
26+
}>;
27+
someVal2.fn("");
28+
>someVal2.fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
29+
>someVal2 : Symbol(someVal2, Decl(stripMembersOptionality.ts, 7, 13))
30+
>fn : Symbol(fn, Decl(stripMembersOptionality.ts, 7, 34))
31+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/stripMembersOptionality.ts ===
2+
// repro from #52494
3+
4+
declare const someVal: Required<{
5+
>someVal : Required<{ fn?(key: string): string | null; }>
6+
7+
fn?(key: string): string | null;
8+
>fn : ((key: string) => string | null) | undefined
9+
>key : string
10+
>null : null
11+
12+
}>;
13+
someVal.fn("");
14+
>someVal.fn("") : string | null
15+
>someVal.fn : (key: string) => string | null
16+
>someVal : Required<{ fn?(key: string): string | null; }>
17+
>fn : (key: string) => string | null
18+
>"" : ""
19+
20+
declare const someVal2: Required<{
21+
>someVal2 : Required<{ fn?: (key: string) => string | null; }>
22+
23+
fn?: (key: string) => string | null;
24+
>fn : ((key: string) => string | null) | undefined
25+
>key : string
26+
>null : null
27+
28+
}>;
29+
someVal2.fn("");
30+
>someVal2.fn("") : string | null
31+
>someVal2.fn : (key: string) => string | null
32+
>someVal2 : Required<{ fn?: (key: string) => string | null; }>
33+
>fn : (key: string) => string | null
34+
>"" : ""
35+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// @strict: true
2+
// @exactOptionalPropertyTypes: true, false
3+
// @noEmit: true
4+
5+
// repro from #52494
6+
7+
declare const someVal: Required<{
8+
fn?(key: string): string | null;
9+
}>;
10+
someVal.fn("");
11+
12+
declare const someVal2: Required<{
13+
fn?: (key: string) => string | null;
14+
}>;
15+
someVal2.fn("");

0 commit comments

Comments
 (0)