mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-07 23:08:20 -06:00
Merge pull request #5344 from Microsoft/excessPropertiesWithUnion
Fix excess property check in union and intersection types
This commit is contained in:
commit
a8fa81b187
@ -4946,34 +4946,34 @@ namespace ts {
|
||||
resolved.stringIndexType || resolved.numberIndexType || getPropertyOfType(type, name)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (type.flags & TypeFlags.UnionOrIntersection) {
|
||||
else if (type.flags & TypeFlags.UnionOrIntersection) {
|
||||
for (let t of (<UnionOrIntersectionType>type).types) {
|
||||
if (isKnownProperty(t, name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function hasExcessProperties(source: FreshObjectLiteralType, target: Type, reportErrors: boolean): boolean {
|
||||
for (let prop of getPropertiesOfObjectType(source)) {
|
||||
if (!isKnownProperty(target, prop.name)) {
|
||||
if (reportErrors) {
|
||||
// We know *exactly* where things went wrong when comparing the types.
|
||||
// Use this property as the error node as this will be more helpful in
|
||||
// reasoning about what went wrong.
|
||||
errorNode = prop.valueDeclaration;
|
||||
reportError(Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1,
|
||||
symbolToString(prop),
|
||||
typeToString(target));
|
||||
if (someConstituentTypeHasKind(target, TypeFlags.ObjectType)) {
|
||||
for (let prop of getPropertiesOfObjectType(source)) {
|
||||
if (!isKnownProperty(target, prop.name)) {
|
||||
if (reportErrors) {
|
||||
// We know *exactly* where things went wrong when comparing the types.
|
||||
// Use this property as the error node as this will be more helpful in
|
||||
// reasoning about what went wrong.
|
||||
errorNode = prop.valueDeclaration;
|
||||
reportError(Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1,
|
||||
symbolToString(prop), typeToString(target));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function eachTypeRelatedToSomeType(source: UnionOrIntersectionType, target: UnionOrIntersectionType): Ternary {
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(9,18): error TS2322: Type '{ forword: string; }' is not assignable to type 'Book'.
|
||||
Object literal may only specify known properties, and 'forword' does not exist in type 'Book'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(11,27): error TS2322: Type '{ foreward: string; }' is not assignable to type 'Book | string'.
|
||||
Object literal may only specify known properties, and 'foreward' does not exist in type 'Book | string'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(13,53): error TS2322: Type '({ foreword: string; } | { forwards: string; })[]' is not assignable to type 'Book | Book[]'.
|
||||
Type '({ foreword: string; } | { forwards: string; })[]' is not assignable to type 'Book[]'.
|
||||
Type '{ foreword: string; } | { forwards: string; }' is not assignable to type 'Book'.
|
||||
Type '{ forwards: string; }' is not assignable to type 'Book'.
|
||||
Object literal may only specify known properties, and 'forwards' does not exist in type 'Book'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(15,42): error TS2322: Type '{ foreword: string; colour: string; }' is not assignable to type 'Book & Cover'.
|
||||
Object literal may only specify known properties, and 'colour' does not exist in type 'Book & Cover'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(17,26): error TS2322: Type '{ foreward: string; color: string; }' is not assignable to type 'Book & Cover'.
|
||||
Object literal may only specify known properties, and 'foreward' does not exist in type 'Book & Cover'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(19,57): error TS2322: Type '{ foreword: string; color: string; price: number; }' is not assignable to type 'Book & Cover'.
|
||||
Object literal may only specify known properties, and 'price' does not exist in type 'Book & Cover'.
|
||||
tests/cases/compiler/objectLiteralExcessProperties.ts(21,43): error TS2322: Type '{ foreword: string; price: number; }' is not assignable to type 'Book & number'.
|
||||
Object literal may only specify known properties, and 'price' does not exist in type 'Book & number'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/objectLiteralExcessProperties.ts (7 errors) ====
|
||||
interface Book {
|
||||
foreword: string;
|
||||
}
|
||||
|
||||
interface Cover {
|
||||
color?: string;
|
||||
}
|
||||
|
||||
var b1: Book = { forword: "oops" };
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ forword: string; }' is not assignable to type 'Book'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'forword' does not exist in type 'Book'.
|
||||
|
||||
var b2: Book | string = { foreward: "nope" };
|
||||
~~~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ foreward: string; }' is not assignable to type 'Book | string'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'foreward' does not exist in type 'Book | string'.
|
||||
|
||||
var b3: Book | (Book[]) = [{ foreword: "hello" }, { forwards: "back" }];
|
||||
~~~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '({ foreword: string; } | { forwards: string; })[]' is not assignable to type 'Book | Book[]'.
|
||||
!!! error TS2322: Type '({ foreword: string; } | { forwards: string; })[]' is not assignable to type 'Book[]'.
|
||||
!!! error TS2322: Type '{ foreword: string; } | { forwards: string; }' is not assignable to type 'Book'.
|
||||
!!! error TS2322: Type '{ forwards: string; }' is not assignable to type 'Book'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'forwards' does not exist in type 'Book'.
|
||||
|
||||
var b4: Book & Cover = { foreword: "hi", colour: "blue" };
|
||||
~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ foreword: string; colour: string; }' is not assignable to type 'Book & Cover'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'colour' does not exist in type 'Book & Cover'.
|
||||
|
||||
var b5: Book & Cover = { foreward: "hi", color: "blue" };
|
||||
~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ foreward: string; color: string; }' is not assignable to type 'Book & Cover'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'foreward' does not exist in type 'Book & Cover'.
|
||||
|
||||
var b6: Book & Cover = { foreword: "hi", color: "blue", price: 10.99 };
|
||||
~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ foreword: string; color: string; price: number; }' is not assignable to type 'Book & Cover'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'price' does not exist in type 'Book & Cover'.
|
||||
|
||||
var b7: Book & number = { foreword: "hi", price: 10.99 };
|
||||
~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '{ foreword: string; price: number; }' is not assignable to type 'Book & number'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'price' does not exist in type 'Book & number'.
|
||||
|
||||
32
tests/baselines/reference/objectLiteralExcessProperties.js
Normal file
32
tests/baselines/reference/objectLiteralExcessProperties.js
Normal file
@ -0,0 +1,32 @@
|
||||
//// [objectLiteralExcessProperties.ts]
|
||||
interface Book {
|
||||
foreword: string;
|
||||
}
|
||||
|
||||
interface Cover {
|
||||
color?: string;
|
||||
}
|
||||
|
||||
var b1: Book = { forword: "oops" };
|
||||
|
||||
var b2: Book | string = { foreward: "nope" };
|
||||
|
||||
var b3: Book | (Book[]) = [{ foreword: "hello" }, { forwards: "back" }];
|
||||
|
||||
var b4: Book & Cover = { foreword: "hi", colour: "blue" };
|
||||
|
||||
var b5: Book & Cover = { foreward: "hi", color: "blue" };
|
||||
|
||||
var b6: Book & Cover = { foreword: "hi", color: "blue", price: 10.99 };
|
||||
|
||||
var b7: Book & number = { foreword: "hi", price: 10.99 };
|
||||
|
||||
|
||||
//// [objectLiteralExcessProperties.js]
|
||||
var b1 = { forword: "oops" };
|
||||
var b2 = { foreward: "nope" };
|
||||
var b3 = [{ foreword: "hello" }, { forwards: "back" }];
|
||||
var b4 = { foreword: "hi", colour: "blue" };
|
||||
var b5 = { foreward: "hi", color: "blue" };
|
||||
var b6 = { foreword: "hi", color: "blue", price: 10.99 };
|
||||
var b7 = { foreword: "hi", price: 10.99 };
|
||||
21
tests/cases/compiler/objectLiteralExcessProperties.ts
Normal file
21
tests/cases/compiler/objectLiteralExcessProperties.ts
Normal file
@ -0,0 +1,21 @@
|
||||
interface Book {
|
||||
foreword: string;
|
||||
}
|
||||
|
||||
interface Cover {
|
||||
color?: string;
|
||||
}
|
||||
|
||||
var b1: Book = { forword: "oops" };
|
||||
|
||||
var b2: Book | string = { foreward: "nope" };
|
||||
|
||||
var b3: Book | (Book[]) = [{ foreword: "hello" }, { forwards: "back" }];
|
||||
|
||||
var b4: Book & Cover = { foreword: "hi", colour: "blue" };
|
||||
|
||||
var b5: Book & Cover = { foreward: "hi", color: "blue" };
|
||||
|
||||
var b6: Book & Cover = { foreword: "hi", color: "blue", price: 10.99 };
|
||||
|
||||
var b7: Book & number = { foreword: "hi", price: 10.99 };
|
||||
Loading…
x
Reference in New Issue
Block a user