@@ -7687,7 +7687,7 @@ namespace ts {
7687
7687
function isKnownProperty(type: Type, name: string): boolean {
7688
7688
if (type.flags & TypeFlags.Object) {
7689
7689
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
7690
- if ((relation === assignableRelation || relation === comparableRelation) && (type === globalObjectType || isEmptyObjectType (resolved)) ||
7690
+ if ((relation === assignableRelation || relation === comparableRelation) && (type === globalObjectType || isEmptyResolvedType (resolved)) ||
7691
7691
resolved.stringIndexInfo ||
7692
7692
(resolved.numberIndexInfo && isNumericLiteralName(name)) ||
7693
7693
getPropertyOfType(type, name)) {
@@ -7704,14 +7704,18 @@ namespace ts {
7704
7704
return false;
7705
7705
}
7706
7706
7707
- function isEmptyObjectType (t: ResolvedType) {
7707
+ function isEmptyResolvedType (t: ResolvedType) {
7708
7708
return t.properties.length === 0 &&
7709
7709
t.callSignatures.length === 0 &&
7710
7710
t.constructSignatures.length === 0 &&
7711
7711
!t.stringIndexInfo &&
7712
7712
!t.numberIndexInfo;
7713
7713
}
7714
7714
7715
+ function isEmptyObjectType(type: Type) {
7716
+ return type.flags & TypeFlags.Object && isEmptyResolvedType(resolveStructuredTypeMembers(<ObjectType>type));
7717
+ }
7718
+
7715
7719
function hasExcessProperties(source: FreshObjectLiteralType, target: Type, reportErrors: boolean): boolean {
7716
7720
if (maybeTypeOfKind(target, TypeFlags.Object) && !(getObjectFlags(target) & ObjectFlags.ObjectLiteralPatternWithComputedProperties)) {
7717
7721
for (const prop of getPropertiesOfObjectType(source)) {
@@ -7925,10 +7929,14 @@ namespace ts {
7925
7929
}
7926
7930
}
7927
7931
}
7932
+ else if ((<MappedType>target).declaration.questionToken && isEmptyObjectType(source)) {
7933
+ return Ternary.True;
7934
+
7935
+ }
7928
7936
}
7929
7937
else if (relation !== identityRelation) {
7930
7938
const resolved = resolveStructuredTypeMembers(<ObjectType>target);
7931
- if (isEmptyObjectType (resolved) || resolved.stringIndexInfo && resolved.stringIndexInfo.type.flags & TypeFlags.Any) {
7939
+ if (isEmptyResolvedType (resolved) || resolved.stringIndexInfo && resolved.stringIndexInfo.type.flags & TypeFlags.Any) {
7932
7940
return Ternary.True;
7933
7941
}
7934
7942
}
0 commit comments