# @typescript-eslint/no-redeclare

> Disallow declaring the same name twice in one scope

`var` lets you declare a name a second time without an error. The second declaration is the same variable as the first, so it overwrites a value that other code may still need. It's usually a copy and paste mistake, or two parts of a long function that picked the same name.

This is `no-redeclare` for TypeScript. It knows about function overloads and the declarations TypeScript merges on purpose, such as two interfaces with the same name.

With `bunfig.toml` you can set either name. `bun lint` runs this rule in TypeScript files and `no-redeclare` in JavaScript files, so nothing is reported twice. With an ESLint config, use it in place of `no-redeclare`, which reports those.

{/* Generated by src/codegen/lint-rule-docs.ts. Do not edit this section. */}

## Configure

Off by default. To turn it on:

```toml bunfig.toml
[lint.rules]
"@typescript-eslint/no-redeclare" = "error" # or "warn"
```

Every option, set to its default:

```toml bunfig.toml
[lint.rules]
"@typescript-eslint/no-redeclare" = ["error", {
  builtinGlobals = true,
  ignoreDeclarationMerge = true,
}]
```

{/* End of the generated section. */}

## Examples

Reported:

{/* bad */}
```ts
function price(items: number[]) {
  var total = items.length;
  for (const item of items) {
    var total = item;
  }
  return total;
}
```

Not reported:

{/* good */}
```ts
function price(items: number[]) {
  let total = items.length;
  for (const item of items) {
    total += item;
  }
  return total;
}
```

Overloads and merged declarations aren't reported either:

{/* good */}
```ts
function parse(input: string): number;
function parse(input: number): number;
function parse(input: string | number) {
  return Number(input);
}

interface Options {
  verbose: boolean;
}
interface Options {
  color: boolean;
}

class Logger {}
namespace Logger {
  export const level = "info";
}
```

## Options

| Option | Default | What it does |
| --- | --- | --- |
| `builtinGlobals` | `true` | Also report a name that's already a global, such as `Object`. This applies to the top level of a script and to `/* global */` comments. The top level of a module is its own scope. |
| `ignoreDeclarationMerge` | `true` | Allow the declarations TypeScript merges: interfaces with interfaces, namespaces with namespaces, and one class, function or enum with namespaces. A class also merges with interfaces. |

Reported by default, and allowed with `builtinGlobals: false`:

{/* bad */}
```ts
/* global process */

console.log(process.platform);
```

{/* good {"options": [{"builtinGlobals": false}]} */}
```ts
/* global process */

console.log(process.platform);
```

Reported with `ignoreDeclarationMerge: false`:

{/* bad {"options": [{"ignoreDeclarationMerge": false}]} */}
```ts
interface Options {
  verbose: boolean;
}
interface Options {
  color: boolean;
}
```

Two enums with the same name are always reported:

{/* bad */}
```ts
enum Level {
  Info,
}
enum Level {
  Error = 1,
}
```
