Skip to content

Commit 081619e

Browse files
committed
Avoid resolving mapped type members too eagerly
1 parent 90685ef commit 081619e

File tree

5 files changed

+8
-104
lines changed

5 files changed

+8
-104
lines changed

src/compiler/checker.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -20849,10 +20849,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2084920849
}
2085020850

2085120851
function isEmptyAnonymousObjectType(type: Type) {
20852-
if (getObjectFlags(type) & ObjectFlags.Mapped && !isGenericMappedType(type)) {
20853-
return isEmptyResolvedType(resolveStructuredTypeMembers(type as ObjectType));
20852+
const objectFlags = getObjectFlags(type);
20853+
if (objectFlags & ObjectFlags.Mapped) {
20854+
return !isGenericMappedType(type) && !!(getConstraintTypeFromMappedType(type as MappedType).flags & TypeFlags.Never);
2085420855
}
20855-
return !!(getObjectFlags(type) & ObjectFlags.Anonymous && (
20856+
return !!(objectFlags & ObjectFlags.Anonymous && (
2085620857
(type as ResolvedType).members && isEmptyResolvedType(type as ResolvedType) ||
2085720858
type.symbol && type.symbol.flags & SymbolFlags.TypeLiteral && getMembersOfSymbol(type.symbol).size === 0
2085820859
));

tests/baselines/reference/intersectionsAndEmptyObjects.errors.txt

-96
This file was deleted.

tests/baselines/reference/intersectionsAndEmptyObjects.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ type Foo1 = { x: string } & { [x: number]: Foo1 };
216216
>x : number
217217

218218
type Foo2 = { x: string } & { [K in number]: Foo2 };
219-
>Foo2 : any
219+
>Foo2 : { x: string; } & { [x: number]: Foo2; }
220220
>x : string
221221

222222
// Repro from #40239

tests/cases/fourslash/codeFixClassImplementInterfaceAutoImports.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@ verify.codeFix({
2828
description: "Implement interface 'Base'",
2929
newFileContent:
3030
`import { Base } from './interface';
31-
import A from './types1';
3231
import { B, C, D } from './types2';
3332
3433
export class C implements Base {
35-
a: Readonly<A> & { kind: 'a'; };
34+
a: { kind: 'a'; };
3635
b<T extends B = B>(p1: C): D<C> {
3736
throw new Error('Method not implemented.');
3837
}

tests/cases/fourslash/completionPreferredSuggestions1.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@
1515

1616
verify.completions({ marker: "1", includes: ["a", "b", "c"] });
1717
verify.completions({ marker: "2", includes: ["0", "1", "2"], isNewIdentifierLocation: true });
18-
verify.completions({ marker: "3", includes: ["a", "b", "c"] });
18+
verify.completions({ marker: "3", exact: [] });
1919
verify.completions({ marker: "4", exact: [] });
20-
verify.completions({ marker: "5", includes: ["a", "b", "c"] });
20+
verify.completions({ marker: "5", exact: [] });

0 commit comments

Comments
 (0)