JavaScript Reserved Identifiers
`reserved-identifiers` is a JavaScript library that provides a comprehensive `Set` of reserved identifiers according to the latest ECMAScript specification (currently ES2023) and module context. It offers a straightforward API to retrieve these identifiers, making it easy to check if a given string is reserved in modern JavaScript environments. The library also includes a dedicated export for TypeScript's built-in reserved types, useful for tooling that needs to validate type names. Maintained by Sindresorhus, the package typically sees stable, infrequent releases focused on incorporating new ECMAScript specifications or minor feature enhancements like the recent addition of TypeScript reserved types in v1.1.0 and strict mode identifiers in v1.2.0. Its primary differentiator is its strict adherence to modern JavaScript standards, intentionally omitting support for older JS versions. This focus ensures accuracy for current development practices, distinguishing it from libraries that might cater to a wider range of historical JS versions. The current stable version is 1.2.0.
Common errors
-
ReferenceError: require is not defined
cause Attempting to import the package using CommonJS `require()` syntax in an ESM-only context (e.g., a modern Node.js project with `type: "module"` or browser modules).fixUse ESM `import` syntax: `import reservedIdentifiers from 'reserved-identifiers';` -
TypeError: reservedIdentifiers is not a function
cause Incorrectly attempting to import the default export `reservedIdentifiers` as a named export, e.g., `import { reservedIdentifiers } from 'reserved-identifiers';`.fixUse the correct default import syntax: `import reservedIdentifiers from 'reserved-identifiers';` -
TypeError: Cannot read properties of undefined (reading 'typeScriptReservedTypes')
cause Attempting to use the `typeScriptReservedTypes` named export in a version of the library prior to v1.1.0, where it was introduced.fixUpgrade the package to `reserved-identifiers@^1.1.0` or higher using `npm install reserved-identifiers@latest`.
Warnings
- gotcha The library explicitly assumes the latest JavaScript version (ES2023) and a module context. It does not support older JavaScript environments, which means certain identifiers might be considered reserved by this library but not by an older runtime, or vice-versa.
- gotcha By default, the `reservedIdentifiers()` set does not include global properties like `globalThis`, `Infinity`, `NaN`, or `undefined`. These are commonly avoided as identifiers but are not strictly 'reserved' by the ECMAScript spec.
- breaking The `typeScriptReservedTypes` named export was introduced in version 1.1.0. Attempting to use this export in versions prior to 1.1.0 will result in a `TypeError` or `undefined`.
- breaking In version 1.2.0, 'missing strict mode reserved identifiers' were added to the default set. This means the `Set` returned by `reservedIdentifiers()` may now contain more entries than in previous versions, potentially causing identifiers that were previously deemed non-reserved to now be considered reserved.
Install
-
npm install reserved-identifiers -
yarn add reserved-identifiers -
pnpm add reserved-identifiers
Imports
- reservedIdentifiers
const reservedIdentifiers = require('reserved-identifiers');import reservedIdentifiers from 'reserved-identifiers';
- typeScriptReservedTypes
import typeScriptReservedTypes from 'reserved-identifiers';
import { typeScriptReservedTypes } from 'reserved-identifiers';
Quickstart
import reservedIdentifiers from 'reserved-identifiers';
import { typeScriptReservedTypes } from 'reserved-identifiers';
// Get the default set of reserved identifiers (ES2023 module context)
const jsReserved = reservedIdentifiers();
const isJsReserved = (identifier) => jsReserved.has(identifier);
console.log('Is "await" reserved?', isJsReserved('await'));
//=> true
console.log('Is "enum" reserved?', isJsReserved('enum'));
//=> true
console.log('Is "myVar" reserved?', isJsReserved('myVar'));
//=> false
// Get the set including common global properties
const jsReservedWithGlobals = reservedIdentifiers({ includeGlobalProperties: true });
const isJsReservedWithGlobals = (identifier) => jsReservedWithGlobals.has(identifier);
console.log('Is "undefined" reserved (default)?', isJsReserved('undefined'));
//=> false
console.log('Is "undefined" reserved (with globals)?', isJsReservedWithGlobals('undefined'));
//=> true
// Get TypeScript-specific reserved types
const tsReservedTypes = typeScriptReservedTypes();
const isTsReservedType = (typeName) => tsReservedTypes.has(typeName);
console.log('Is "any" a reserved TypeScript type?', isTsReservedType('any'));
//=> true
console.log('Is "string" a reserved TypeScript type?', isTsReservedType('string'));
//=> true