Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calling never-returning method on a subtype of function does not consider following code as unreachable #60059

Closed
AlCalzone opened this issue Sep 25, 2024 · 3 comments

Comments

@AlCalzone
Copy link
Contributor

AlCalzone commented Sep 25, 2024

πŸ”Ž Search Terms

function member never ts2534

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about never

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.7.0-dev.20240925#code/C4TwDgpgBAaghgGwJYBM7CQewHYDECu2AxhjlALxQAUAdHXAM4MQBOp2DAXFIQNbaYA7tgDaAXQCUFAHxQAbplQBuAFAqk2YKwBmcItHjI0WqBAAeW7CgaxEqdFjyESjqAG8VASF1IEVCdzYEHKsqgC+atrO7PJ2xhAAkpqs2Ii09Eys7Fw82PxCopLcCqjuXkja1ACEjMxsjgw0wawgVABCmJgIEHDYElIenp7AABYsQlBBglAAoizjLFQARHJxDmQ+3ShLEqqeEREqRDgMwLFG6NCUqxdaSVosqQg0AEYaKFSEKBDaGhAoUkYtluEFUN3sWhomwo1Ck5Fk4PiVF0CGYgJsfAEwigQKCIRYqki0Vcm38gWaLDKUHOEIgULgvn8qmpAHoWdSORyAHoAfhUhyixBiQVO-1wDL8AUmFLKnjZk0wpnmmEpI1YEC8pN2XnlvP5ahFWhQ4sZuyg8tGSBso3Gghs7wg-xUCEwAHNlihSgIzjahDtVEA

πŸ’» Code

type ValidationFunction = (...assertions: unknown[]) => void;

interface Validate extends ValidationFunction {
	fail(): never;
}

function validateInternal(...assertions: unknown[]): void {
	if (!assertions.every(Boolean)) {
		throw new Error("validation failed");
	}
}

const validate = validateInternal.bind(undefined) as Validate;
validate.fail = () => validate(false) as unknown as never;


function fail(): never {
  validate.fail();
  //        ^? (method) Validate.fail(): never
}

function nestedFail(): never {
	// no error here
	fail();
	// ^? function fail(): never
}

nestedFail(); // this throws indeed
log("did not throw");

πŸ™ Actual behavior

TS complains about the never return type of function fail():

A function returning 'never' cannot have a reachable end point.(2534)

πŸ™‚ Expected behavior

No errors

Additional information about the issue

No response

@MartinJohns
Copy link
Contributor

MartinJohns commented Sep 25, 2024

This is working as intended / a design limitation. See #32695.

A function call is analyzed as an assertion call or never-returning call when

  • the call occurs as a top-level expression statement, and
  • the call specifies a single identifier or a dotted sequence of identifiers for the function name, and
  • each identifier in the function name references an entity with an explicit type, and
  • the function name resolves to a function type with an asserts return type or an explicit never return type annotation.

validate does not have an explicit type.

@AlCalzone
Copy link
Contributor Author

AlCalzone commented Sep 25, 2024

Edit: I was too fast. Thanks for the update, it does work with an explicit type annotation on validate.

@AlCalzone AlCalzone closed this as not planned Won't fix, can't repro, duplicate, stale Sep 25, 2024
@MartinJohns
Copy link
Contributor

Is that because validate has no type annotation?

Correct, it has no explicit type. I just edited my comment to add that information. This limitation was added for performance reasons.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants