src/content/docs/linter/rules/no-invalid-use-before-declaration.mdx
import { Tabs, TabItem } from '@astrojs/starlight/components';
<Tabs> <TabItem label="JavaScript (and super languages)" icon="seti:javascript"> ## Summary - Rule available since: `v1.5.0` - Diagnostic Category: [`lint/correctness/noInvalidUseBeforeDeclaration`](/reference/diagnostics#diagnostic-category) - This rule is **recommended**, meaning it is enabled by default. - This rule doesn't have a fix. - The default severity of this rule is [**error**](/reference/diagnostics#error). - Sources: - Same as [`no-use-before-define`](https://eslint.org/docs/latest/rules/no-use-before-define) - Same as [`@typescript-eslint/no-use-before-define`](https://typescript-eslint.io/rules/no-use-before-define){
"linter": {
"rules": {
"correctness": {
"noInvalidUseBeforeDeclaration": "error"
}
}
}
}
Disallow the use of variables, function parameters, classes, and enums before their declaration
JavaScript doesn't allow the use of block-scoped variables (let, const), function parameters, and classes before their declaration.
Similarly TypeScript doesn't allow the use of enums before their declaration.
A ReferenceError will be thrown with any attempt to access the variable or the parameter before its declaration.
The rule also reports the use of variables declared with var before their declarations.
function f() {
console.log(x);
let x;
}
function f() {
console.log(x);
var x = 0;
}
function f(a = b, b = 0) {}
new C();
class C {}
f();
function f() {}
// An export can reference a variable before its declaration.
export { CONSTANT };
const CONSTANT = 0;
function f() { return CONSTANT; }
const CONSTANT = 0;
function f() {
new C();
}
let c: C;
class C {}