typescript/no-complex-declarator-type
Disallow complex inferred declarator types without explicit annotation.
Targeted pattern scope
This rule targets variable declarators whose identifier has no explicit type annotation.
It is intended to catch complex inferred declarators and prompt an explicit
annotation (or as const, where appropriate).
What this rule reports
This rule reports variable declarators with complex assertions/inference when no explicit type annotation is present.
Why this rule exists
Complex inferred declarations can obscure the intended variable contract, especially when assertions are involved.
❌ Incorrect
const value = (() => 1) as () => number;
✅ Correct
const value: () => number = (() => 1) as () => number;
Behavior and migration notes
This rule reports only and does not provide an autofix.
Migration is usually adding an explicit annotation to the declarator identifier.
Options
This rule has no options.
Additional examples
const model = {
run() {
return 1;
},
} as {
run(): number;
};
// ❌ reported without an explicit declarator annotation
const typedModel: { run(): number } = {
run() {
return 1;
},
};
// ✅ valid
ESLint flat config example
import etcMisc from "eslint-plugin-etc-misc";
export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"etc-misc/typescript/no-complex-declarator-type": "error",
},
},
];
When not to use it
Disable this rule if your project allows complex inferred declarator types without annotations.
Package documentation
Rule catalog ID: R086
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.