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.