Skip to content

never type as argument in conditional sub-type position does not evaluate conditional #61594

@jasonkuhrt

Description

@jasonkuhrt

🔎 Search Terms

never, conditional, parameter, argument

🕗 Version & Regression Information

I did not exhaustively check older versions of TS yet. This issue feels like bug to me, but I don't know how to search for it as its a specific circumstance that has no particular label that I know of.

  • This changed between versions ______ and _______
  • This changed in commit or PR _______
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about _________
  • I was unable to test this on prior versions because _______

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/HYQwtgpgzgDiDGEAE8AWF4GsD6BLK2wEAbhAE7YQAeALhMACYFxngR1lIDeAUAJA0AnjGQASADwwAfEgC8SIqU7U6jKEhhIA-EhpkArsgBcSAGYgANlAg9+QkUnyES5SrXpM5SCQEYZAen8kYJDQhRdldzUkH21dA2MzS2t+QPjDWwFhZCdFVxUPAjzOeQligKDipALoqp09QyQTcysbPjSGmwBfW1BIWARkNAwcJxY2DjdVJmclbjts70kZeU0azzr0xJaUhYdciKnC2fIvMoiK8Ln19U3OpqTW1MqIpHEAWk+v75-fv-+AYCgdotFpMvYcgQfEc1CcSks-Eg0mEQrEbldTvUEg8dm00rieD0eH1oHBECh0Fg8FCYTNxpAOPMsg4JNIvGiop5NFjGs1kjY9pDsNCbnCzuJykighzprdXjztvzno9dsyhSLOVDxYjkSiYtVNfqFTile0gp1Cb02ANycMqWMQKwGflNcKmRClmzVgbZUatianoLHDTRVVShKLlL9ei7ti+U8zRjOB8gam0+m-iCwUGnBrZW7wzqgnro4bYsb4ylExaukA

💻 Code

namespace check_is_never_extends_parameter {
	type $<p> = never extends p ? true : false

	type is_never_extends = $<1> //           never extends 1 ? true : false
	// true

	type is_never_extends_never = $<never> // never extends never ? true : false
	// true
}

namespace check_is_parameter_extends_never {
	type $<p> = p extends never ? true : false

	type is_never_extends_never = $<never> // never extends never ? true : false
	// never <------------------------------------------------------------------ ???

	type is_1_extends_never = $<1> //         1 extends never ? true : false
	// false
}

namespace check_is_1_extends_parameter {
	type $<p> = 1 extends p ? true : false

	type is_1_extends_never = $<never> // 1 extends never ? true : false
	// false

	type is_1_extends_1 = $<1> //         1 extends 1 ? true : false
	// true
}

namespace check_is_parameter_extends_1 {
	type $<p> = p extends 1 ? true : false

	type is_1_extends_never = $<never> // 1 extends never ? true : false
	// never <---------------------------------------------------------- ???

	type is_1_extends_1 = $<1> //         1 extends 1 ? true : false
	// true
}

🙁 Actual behavior

Best way I can describe this so far:

  1. never given as a type argument
  2. ... to a conditional type
  3. ... where the respective parameter is referenced in the sub-type-position of the conditional (x (<-- sub-type position) extends y (<-- super-type position))
  4. ... evaluates to never
  5. ... instead of the conditional being evaluated (in this case, true/false).

🙂 Expected behavior

I expect a types to be evaluated consistently when never is given as an argument.

Additional information about the issue

I hit this issue while working on my library https://graffle.js.org.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions