Skip to main content

no-use-extend-native

Disallow consuming non-native members on statically recognizable JavaScript built-ins.

Targeted pattern scope

This rule checks statically named member access on built-in constructors, namespaces, prototypes, and expression forms whose native type is unambiguous.

What this rule reports

The rule recognizes built-in constructors, namespaces, prototypes, literal values, array/object/function expressions, callable built-in conversions, and statically inferable binary-expression results. It reports:

  • a statically named member absent from the built-in's native API;
  • calling a native data property or accessor as a function; and
  • using a prototype member as a static member, or a static member as an instance member.

Static computed strings are checked. Dynamic computed properties are ignored. Shadowed global names and explicitly declared object-literal properties are also ignored to prevent common false positives.

Why this rule exists

Code that consumes monkey-patched native members has hidden runtime coupling and fails when the patch is absent, reordered, or removed.

❌ Incorrect

"value".green;
[].customMethod();
new Float32Array().customMethod();
new Map().size();
String.toUpperCase();
"value".fromCharCode();

✅ Correct

"value".toUpperCase();
[].map(String);
new Float32Array().values();
new Map().size;
String.fromCharCode(65);

({ custom: true }).custom;

class Array {
custom(): void {}
}
new Array().custom();

Behavior and migration notes

Coverage includes the standard error constructors, arrays and typed arrays, ArrayBuffer, SharedArrayBuffer, DataView, primitive wrappers, collections, promises, regular expressions, weak collections/references, and namespace objects such as Atomics, Intl, JSON, Math, and Reflect when they exist in the lint runtime.

The rule reads property descriptors from the lint runtime. A runtime newer than the deployment target can therefore recognize APIs unavailable in that target; pair this rule with a compatibility rule when target-version enforcement is required.

Options and fixes

This rule has no options and no fixer. Replacing a non-native member requires project-specific knowledge.

Relationship to core no-extend-native

Core no-extend-native prevents code from adding properties to native prototypes. This rule prevents code from relying on those added properties. The rules are complementary.

ESLint flat config example

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

export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"no-extend-native": "error",
"etc-misc/no-use-extend-native": "error",
},
},
];

When not to use it

Disable the rule when the runtime intentionally guarantees specific prototype patches, or when lint-runtime feature detection is not an acceptable API baseline.

Package documentation

Rule catalog ID: R068

Further reading

Upstream inspiration

Modernized from eslint-plugin-no-use-extend-native.

Additional resources

Adoption resources

  • Start at warning level in CI, then move to error after cleanup.
  • Review each finding against the configured JavaScript runtime baseline.