@@ -3352,6 +3352,25 @@ namespace ts {
3352
3352
return undefined;
3353
3353
}
3354
3354
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
+
3355
3374
function getSignaturesOfStructuredType(type: Type, kind: SignatureKind): Signature[] {
3356
3375
if (type.flags & TypeFlags.StructuredType) {
3357
3376
let resolved = resolveStructuredTypeMembers(<ObjectType>type);
@@ -4601,20 +4620,14 @@ namespace ts {
4601
4620
}
4602
4621
4603
4622
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));
4614
4627
}
4628
+ return true;
4615
4629
}
4616
4630
}
4617
- return false;
4618
4631
}
4619
4632
4620
4633
function eachTypeRelatedToSomeType(source: UnionOrIntersectionType, target: UnionOrIntersectionType): Ternary {
0 commit comments