Skip to content

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

@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
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions