Skip to content

any appears to shortcircut structural type checking #31295

Description

@webstrand

TypeScript Version: 3.5.0-dev.20190507

Search Terms:
any, unsound, extends, never

Code

// I detect if F is `any` by checking if F extends `never`.
// (F extends never ? true : false) produces `true|false` for `F = any`
// and `false` or `never` for everything else.
type Decider<F> = {
	prop: (F extends never ? true : false) extends false ? "isNotAny" : "isAny";
};

let foo!: Decider<string>;
let bar: Decider<any> = foo;

let fooProp: "isNotAny" = foo.prop;
let barProp: "isAny" = bar.prop;

Expected behavior:
Either bar.prop should have the type "isAny"|"isNotAny" or foo should not be assignable to bar.

Actual behavior:
foo is assignable to bar and bar.prop has the type "isAny" which is incompatible with foo.prop's "isNotAny".

Playground Link: link

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions