Skip to content

Commit f57991e

Browse files
committed
Support union and intersection types in checks
1 parent 3fe7591 commit f57991e

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

src/compiler/checker.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)