Merge pull request #8697 from Microsoft/Fix8694
Fix #8694: check for singatures before calling a type empty
This commit is contained in:
commit
0275fe25d7
|
@ -6030,7 +6030,7 @@ namespace ts {
|
||||||
if (type.flags & TypeFlags.ObjectType) {
|
if (type.flags & TypeFlags.ObjectType) {
|
||||||
const resolved = resolveStructuredTypeMembers(type);
|
const resolved = resolveStructuredTypeMembers(type);
|
||||||
if ((relation === assignableRelation || relation === comparableRelation) &&
|
if ((relation === assignableRelation || relation === comparableRelation) &&
|
||||||
(type === globalObjectType || resolved.properties.length === 0) ||
|
(type === globalObjectType || isEmptyObjectType(resolved)) ||
|
||||||
resolved.stringIndexInfo || resolved.numberIndexInfo || getPropertyOfType(type, name)) {
|
resolved.stringIndexInfo || resolved.numberIndexInfo || getPropertyOfType(type, name)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -6045,6 +6045,14 @@ namespace ts {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isEmptyObjectType(t: ResolvedType) {
|
||||||
|
return t.properties.length === 0 &&
|
||||||
|
t.callSignatures.length === 0 &&
|
||||||
|
t.constructSignatures.length === 0 &&
|
||||||
|
!t.stringIndexInfo &&
|
||||||
|
!t.numberIndexInfo;
|
||||||
|
}
|
||||||
|
|
||||||
function hasExcessProperties(source: FreshObjectLiteralType, target: Type, reportErrors: boolean): boolean {
|
function hasExcessProperties(source: FreshObjectLiteralType, target: Type, reportErrors: boolean): boolean {
|
||||||
if (!(target.flags & TypeFlags.ObjectLiteralPatternWithComputedProperties) && maybeTypeOfKind(target, TypeFlags.ObjectType)) {
|
if (!(target.flags & TypeFlags.ObjectLiteralPatternWithComputedProperties) && maybeTypeOfKind(target, TypeFlags.ObjectType)) {
|
||||||
for (const prop of getPropertiesOfObjectType(source)) {
|
for (const prop of getPropertiesOfObjectType(source)) {
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
tests/cases/compiler/excessPropertyErrorForFunctionTypes.ts(4,44): error TS2322: Type '{ a: number; c: number; d: number; }' is not assignable to type '{ a: number; c: number; } | (() => any)'.
|
||||||
|
Object literal may only specify known properties, and 'd' does not exist in type '{ a: number; c: number; } | (() => any)'.
|
||||||
|
|
||||||
|
|
||||||
|
==== tests/cases/compiler/excessPropertyErrorForFunctionTypes.ts (1 errors) ====
|
||||||
|
type FunctionType = () => any;
|
||||||
|
type DoesntWork = { a: number, c: number } | FunctionType;
|
||||||
|
|
||||||
|
let doesntWork: DoesntWork = { a: 1, c: 2, d: 3 }
|
||||||
|
~~~~
|
||||||
|
!!! error TS2322: Type '{ a: number; c: number; d: number; }' is not assignable to type '{ a: number; c: number; } | (() => any)'.
|
||||||
|
!!! error TS2322: Object literal may only specify known properties, and 'd' does not exist in type '{ a: number; c: number; } | (() => any)'.
|
|
@ -0,0 +1,8 @@
|
||||||
|
//// [excessPropertyErrorForFunctionTypes.ts]
|
||||||
|
type FunctionType = () => any;
|
||||||
|
type DoesntWork = { a: number, c: number } | FunctionType;
|
||||||
|
|
||||||
|
let doesntWork: DoesntWork = { a: 1, c: 2, d: 3 }
|
||||||
|
|
||||||
|
//// [excessPropertyErrorForFunctionTypes.js]
|
||||||
|
var doesntWork = { a: 1, c: 2, d: 3 };
|
|
@ -0,0 +1,4 @@
|
||||||
|
type FunctionType = () => any;
|
||||||
|
type DoesntWork = { a: number, c: number } | FunctionType;
|
||||||
|
|
||||||
|
let doesntWork: DoesntWork = { a: 1, c: 2, d: 3 }
|
Loading…
Reference in a new issue