typescript/no-redundant-undefined-return-type
Disallow redundant undefined in return type unions when a function
deterministically returns a definitely-defined value.
Targeted pattern scope
This rule targets functions with:
- an explicit return type union including
undefined, and - a function body that deterministically returns a syntactically definitely defined value.
The current deterministic patterns are intentionally conservative:
- expression-bodied functions returning definitely defined expressions
- block-bodied functions with exactly one
returnstatement whose argument is definitely defined
What this rule reports
This rule reports cases such as:
(): string | undefined => "x"function f(): number | undefined { return 1; }
because the implementation deterministically returns a defined value, making
| undefined redundant.
Why this rule exists
When function implementations deterministically return defined
values, keeping | undefined in the return type adds type noise and weakens API
clarity.
❌ Incorrect
const read = (): string | undefined => "x";
function count(): number | undefined {
return 1;
}
class Box {
get label(): string | undefined {
return "box";
}
}
✅ Correct
const read = (): string => "x";
function count(): number {
return 1;
}
class Box {
get label(): string {
return "box";
}
}
Behavior and migration notes
This rule is autofixable and also provides suggestions.
The fixer removes undefined from the top-level return type union while
preserving remaining union members.
To avoid unsafe assumptions, this rule intentionally does not report complex
control-flow cases where proving deterministic non-undefined return values is
not trivial.
Options
This rule has no options.
Additional examples
const value: string | undefined = undefined;
const read = (): string | undefined => value;
// ✅ valid (returned identifier may be undefined)
function read(): string | undefined {
const value = "x";
return value;
}
// ✅ valid (multiple statements in block body are out of conservative scope)
ESLint flat config example
import etcMisc from "eslint-plugin-etc-misc";
export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"etc-misc/typescript/no-redundant-undefined-return-type": "warn",
},
},
];
When not to use it
Disable this rule if your team intentionally keeps explicit | undefined in
return types for stylistic consistency, even when current implementations are
deterministically defined.
Package documentation
Rule catalog ID: R098
Further reading
Adoption resources
- Start at warning level in CI, then move to error after cleanup.
- Use focused codemods/autofix batches per package or directory.