Skip to main content

typescript/prefer-readonly-map

Require ReadonlyMap instead of Map in type positions.

Deprecated

Use only the scoped local rules for positions your project intends to govern. The typescript-eslint replacement performs deeper, type-aware parameter analysis. Do not enable this broad rule alongside those replacements because their diagnostics overlap.

Targeted pattern scope​

This rule targets Map identifier references in TypeScript type references.

What this rule reports​

This rule reports Map type references in TypeScript annotations.

Why this rule exists​

ReadonlyMap better communicates read-only intent in APIs that should not mutate incoming maps.

❌ Incorrect​

function f(values: Map<string, string>) {}

✅ Correct​

function f(values: ReadonlyMap<string, string>) {}

Behavior and migration notes​

This rule reports only and does not provide an autofix.

Migration is usually replacing Map<K, V> with ReadonlyMap<K, V> in type positions.

Options​

This rule has no options.

Additional examples​

type Cache = Map<string, number>;
// ❌ reported

type CacheView = ReadonlyMap<string, number>;
// ✅ valid

ESLint flat config example​

import etcMisc from "eslint-plugin-etc-misc";

export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"etc-misc/typescript/prefer-readonly-map": "error",
},
},
];

When not to use it​

Disable this rule if mutable maps are expected throughout your codebase.

Package documentation​

Rule catalog ID: R137

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.