Closed
Description
TypeScript Version: 2.2.1
Code
const a: Promise<{ foo: 'bar' }> = Promise.resolve({ foo: 'typo' });
const b: Promise<{ foo: 'bar' }> = Promise.resolve({});
Expected behavior:
a
should type-check: it constrainsfoo
to'bar'
but is given'typo'
.b
should type-check: it requiresfoo
but is given an object withoutfoo
.
Actual behavior:
Neither type-check.
The same types check fine when resolved directly:
// Type '{ foo: "typo"; }' is not assignable to type '{ foo: "bar"; }'.
// Types of property 'foo' are incompatible.
// Type '"typo"' is not assignable to type '"bar"'.
const a: { foo: 'bar' } = { foo: 'typo' });
// Type '{}' is not assignable to type '{ foo: "bar"; }'.
// Property 'foo' is missing in type '{}'.
const b: { foo: 'bar' } = {};
Generic parameter type checks fail for objects/types of different shapes:
// Type 'Promise<{ foo: string; bar: string; }>' is not assignable to type 'Promise<{ foo: "bar"; }>'.
// Type '{ foo: string; bar: string; }' is not assignable to type '{ foo: "bar"; }'.
// Types of property 'foo' are incompatible.
// Type 'string' is not assignable to type '"bar"'.
const a: Promise<{ foo: 'bar' }> = Promise.resolve({ foo: 'bar', bar: 'baz' });
// Type 'Promise<number>' is not assignable to type 'Promise<{ foo: "bar"; }>'.
// Type 'number' is not assignable to type '{ foo: "bar"; }'.
const b: Promise<{ foo: 'bar' }> = Promise.resolve(1);