@@ -3352,6 +3352,25 @@ namespace ts {
33523352 return undefined;
33533353 }
33543354
3355+ function isKnownProperty(type: Type, name: string): boolean {
3356+ if (type.flags & TypeFlags.ObjectType) {
3357+ var resolved = resolveStructuredTypeMembers(type);
3358+ return !!(resolved.properties.length === 0 ||
3359+ resolved.stringIndexType ||
3360+ resolved.numberIndexType ||
3361+ getPropertyOfType(type, name));
3362+ }
3363+ if (type.flags & TypeFlags.UnionOrIntersection) {
3364+ for (let t of (<UnionOrIntersectionType>type).types) {
3365+ if (isKnownProperty(t, name)) {
3366+ return true;
3367+ }
3368+ }
3369+ return false;
3370+ }
3371+ return true;
3372+ }
3373+
33553374 function getSignaturesOfStructuredType(type: Type, kind: SignatureKind): Signature[] {
33563375 if (type.flags & TypeFlags.StructuredType) {
33573376 let resolved = resolveStructuredTypeMembers(<ObjectType>type);
@@ -4601,20 +4620,14 @@ namespace ts {
46014620 }
46024621
46034622 function hasExcessProperties(source: ObjectType, target: Type, reportErrors: boolean): boolean {
4604- if (target.flags & TypeFlags.ObjectType) {
4605- var resolved = resolveStructuredTypeMembers(target);
4606- if (resolved.properties.length > 0 && !resolved.stringIndexType && !resolved.numberIndexType) {
4607- for (let prop of getPropertiesOfObjectType(source)) {
4608- if (!getPropertyOfType(target, prop.name)) {
4609- if (reportErrors) {
4610- reportError(Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target));
4611- }
4612- return true;
4613- }
4623+ for (let prop of getPropertiesOfObjectType(source)) {
4624+ if (!isKnownProperty(target, prop.name)) {
4625+ if (reportErrors) {
4626+ reportError(Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target));
46144627 }
4628+ return true;
46154629 }
46164630 }
4617- return false;
46184631 }
46194632
46204633 function eachTypeRelatedToSomeType(source: UnionOrIntersectionType, target: UnionOrIntersectionType): Ternary {
0 commit comments