Skip to content

Commit 3c846b4

Browse files
committed
Revert part of the removeMissingType and add a test for it
1 parent 3407b6b commit 3c846b4

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19927,10 +19927,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1992719927
let reportedError = false;
1992819928
for (const value of iterator) {
1992919929
const { errorNode: prop, innerExpression: next, nameType, errorMessage } = value;
19930-
const targetPropType = getBestMatchIndexedAccessTypeOrUndefined(source, target, nameType);
19930+
let targetPropType = getBestMatchIndexedAccessTypeOrUndefined(source, target, nameType);
1993119931
if (!targetPropType || targetPropType.flags & TypeFlags.IndexedAccess) continue; // Don't elaborate on indexes on generic variables
19932-
const sourcePropType = getIndexedAccessTypeOrUndefined(source, nameType);
19932+
let sourcePropType = getIndexedAccessTypeOrUndefined(source, nameType);
1993319933
if (!sourcePropType) continue;
19934+
const propName = getPropertyNameFromIndex(nameType, /*accessNode*/ undefined);
1993419935
if (!checkTypeRelatedTo(sourcePropType, targetPropType, relation, /*errorNode*/ undefined)) {
1993519936
const elaborated = next && elaborateError(next, sourcePropType, targetPropType, relation, /*headMessage*/ undefined, containingMessageChain, errorOutputContainer);
1993619937
reportedError = true;
@@ -19945,6 +19946,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1994519946
resultObj.errors = [diag];
1994619947
}
1994719948
else {
19949+
const targetIsOptional = !!(propName && (getPropertyOfType(target, propName) || unknownSymbol).flags & SymbolFlags.Optional);
19950+
const sourceIsOptional = !!(propName && (getPropertyOfType(source, propName) || unknownSymbol).flags & SymbolFlags.Optional);
19951+
targetPropType = removeMissingType(targetPropType, targetIsOptional);
19952+
sourcePropType = removeMissingType(sourcePropType, targetIsOptional && sourceIsOptional);
1994819953
const result = checkTypeRelatedTo(specificSource, targetPropType, relation, prop, errorMessage, containingMessageChain, resultObj);
1994919954
if (result && specificSource !== sourcePropType) {
1995019955
// If for whatever reason the expression type doesn't yield an error, make sure we still issue an error on the sourcePropType
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
strictOptionalPropertiesErrors1.ts(2,15): error TS2322: Type 'string' is not assignable to type 'number | boolean'.
2+
3+
4+
==== strictOptionalPropertiesErrors1.ts (1 errors) ====
5+
function test1(arg: [string, (boolean | number)?]) {}
6+
test1(['foo', 'bar']);
7+
~~~~~
8+
!!! error TS2322: Type 'string' is not assignable to type 'number | boolean'.
9+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//// [tests/cases/compiler/strictOptionalPropertiesErrors1.ts] ////
2+
3+
=== strictOptionalPropertiesErrors1.ts ===
4+
function test1(arg: [string, (boolean | number)?]) {}
5+
>test1 : Symbol(test1, Decl(strictOptionalPropertiesErrors1.ts, 0, 0))
6+
>arg : Symbol(arg, Decl(strictOptionalPropertiesErrors1.ts, 0, 15))
7+
8+
test1(['foo', 'bar']);
9+
>test1 : Symbol(test1, Decl(strictOptionalPropertiesErrors1.ts, 0, 0))
10+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [tests/cases/compiler/strictOptionalPropertiesErrors1.ts] ////
2+
3+
=== strictOptionalPropertiesErrors1.ts ===
4+
function test1(arg: [string, (boolean | number)?]) {}
5+
>test1 : (arg: [string, (boolean | number)?]) => void
6+
>arg : [string, (number | boolean)?]
7+
8+
test1(['foo', 'bar']);
9+
>test1(['foo', 'bar']) : void
10+
>test1 : (arg: [string, (number | boolean)?]) => void
11+
>['foo', 'bar'] : [string, string]
12+
>'foo' : "foo"
13+
>'bar' : "bar"
14+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @strict: true
2+
// @exactOptionalPropertyTypes: true
3+
// @noEmit: true
4+
5+
function test1(arg: [string, (boolean | number)?]) {}
6+
test1(['foo', 'bar']);

0 commit comments

Comments
 (0)