Skip to content

Type predicate can sometimes result in different type than type discriminationΒ #46909

Closed
@aslilac

Description

@aslilac

Bug Report

πŸ”Ž Search Terms

predicate, discrimination

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about 4.5.2. Test in 4.0 and nightly as well.

⏯ Playground Link

Playground link

πŸ’» Code

function test(x: unknown) {
	if (typeof x === "string" || x === 0) {
		x
		if (x === "hello" || x === 0) {
			x
		}
	}

	if (check1(x)) {
		x
		if (check2(x)) {
			x
		}
	}
}

function check1(x: unknown): x is (string | 0) {
	return typeof x === "string" || x === 0;
}

function check2(x: unknown): x is ("hello" | 0) {
	return x === "hello" || x === 0;
}

πŸ™ Actual behavior

In the first set of nested scopes, typeof x is narrowed to string | 0 by the first if, and then "hello" | 0 by the second if. This behavior is correct.
In the second set of nested scopes, typeof x is narrowed to string | 0 by the first if, but is narrowed to 0 by the second if.

πŸ™‚ Expected behavior

"hello" is a valid part of the subset of string, and should be included in the union type. The types derived from these two methods should be identical.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions