Skip to content

Strange stateful behavior with inferred type predicate type #17451

Closed

Description

TypeScript Version: nightly (2.5.0-dev.20170725)

Code

function tryCast<T, U extends T>(value: T, predicate: (t: T) => t is U): U | undefined {
    return predicate(value) ? value : undefined;
}

declare const sn: string | number;

const x: number | undefined = tryCast(sn, (n): n is number => typeof n === "number"); // Always works

const y = tryCast(sn, (n): n is number => typeof n === "number");

const z: number | undefined = y;

Expected behavior:

No error.

Actual behavior:

src/a.ts(11,7): error TS2322: Type 'string | number | undefined' is not assignable to type 'number | undefined'.
  Type 'string' is not assignable to type 'number | undefined'.

Depending on the order I hover over things, hovering over tryCast and y might show a type of string | number | undefined, but it might show a type of number | undefined. (But the error at z is always present.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptFixedA PR has been merged for this issue

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions