TypeScript icon indicating copy to clipboard operation
TypeScript copied to clipboard

isolatedDeclarations should not have warning for functions that have no return statements

Open Jack-Works opened this issue 1 year ago • 4 comments

🔎 Search Terms

isolatedDeclaration

🕗 Version & Regression Information

5.5.0

⏯ Playground Link

https://www.typescriptlang.org/play/?isolatedDeclarations=true&ts=5.5.0-dev.20240426#code/KYDwDg9gTgLgBAMwK4DsDGMCWEWIBQCUcA3gL5A

💻 Code

export function f() {}

🙁 Actual behavior

Function must have an explicit return type annotation with --isolatedDeclarations. (9007)

🙂 Expected behavior

No error

Additional information about the issue

Functions with no return statements can be easily inferred as type void, so there is no need to give this warning.

Jack-Works avatar Apr 26 '24 16:04 Jack-Works

This error is intentional; a function without a return may not always be void.

declare function fail(): never;
export function f() {
	fail();
}
export const g = () => {
	fail();
}

Is:

export declare function f(): void;
export declare const g: () => never;

This can't be determined without type analysis, so is disallowed under isolatedDeclarations.

Playground Link

jakebailey avatar Apr 26 '24 16:04 jakebailey

Correct error for function expressions, but not function declarations - declarations won't infer never

RyanCavanaugh avatar Apr 26 '24 16:04 RyanCavanaugh

#58331 is indiscriminate in what it affects; if we want to allow this for function declarations only, that may be possible, but it sure seems like an extra inconsistency just to avoid writing : void (and how often do people define a noop function?).

jakebailey avatar Apr 26 '24 16:04 jakebailey

hmm, I didn't think of never, so the function expression part is wrong. But I find it annoying to write : void for obviously clear function declarations.

Jack-Works avatar Apr 26 '24 16:04 Jack-Works

Discussed and we don't want to make it untenable to, in the future, change the rules around function declaration return type inference. For example, it's maybe preferable that

function dofail() {
  Debug.fail("oops");
}

have an inferred return type of never (as it would if written as a function expression) rather than void.

RyanCavanaugh avatar May 03 '24 19:05 RyanCavanaugh