Skip to content

Generic parameters not fully type-checked (e.g., Promise) #14770

Closed
@stephencelis

Description

@stephencelis

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 constrains foo to 'bar' but is given 'typo'.
  • b should type-check: it requires foo but is given an object without foo.

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);

Metadata

Metadata

Assignees

Labels

Breaking ChangeWould introduce errors in existing codeFixedA PR has been merged for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions