TypeScript String Enums
The `typescript-string-enums` library, currently at stable version 1.0.0, provided a mechanism for creating typesafe string enums in TypeScript environments prior to version 2.4. Its primary utility was to overcome limitations of native TypeScript number enums and the lack of native string enums, offering compile-time type safety for string values. Key features include the `Enum` factory function to define enums with either direct string values or mapped key-value pairs, helper functions like `Enum.isType()` for type guarding, and `Enum.keys()` and `Enum.values()` for strictly typed access to enum keys and values. The library also supports JSDoc comments for enum members and allows creating enums where keys are automatically mirrored as values using `Enum.ofKeys()`. While the library had a steady release cadence up to 0.3.x, development has largely ceased, with the 1.0.0 release being a commitment to stability rather than new features. This library is now largely superseded by native string enums introduced in TypeScript 2.4, which offer similar functionality without a third-party dependency. It is recommended to use native string enums in modern TypeScript projects.
Common errors
-
Type 'string' is not assignable to type '"RED" | "GREEN" | "BLUE" | "PUCE"'.
cause Attempting to assign a plain `string` type to a variable typed as the enum without using `Enum.isType` as a guard.fixWrap the assignment or usage in an `if (Enum.isType(MyEnum, myString))` guard, or ensure the string literal is directly one of the enum values. -
Type '"hello"' is not assignable to type '"RUNNING" | "STOPPED"'.
cause Attempting to assign a string literal that is not one of the defined enum values to a variable typed with the enum's union type.fixOnly assign values that are explicitly part of the enum's allowed string literals, or validate user input using `Enum.isType` before assignment. -
Module not found: Error: Can't resolve 'typescript-string-enums'
cause The package `typescript-string-enums` is not installed or not correctly referenced in `package.json`.fixRun `npm install --save typescript-string-enums` or `yarn add typescript-string-enums` to add the package to your project dependencies.
Warnings
- breaking This library is largely superseded by native string enums introduced in TypeScript 2.4. It is strongly recommended to use native string enums for new projects or when upgrading TypeScript.
- breaking The npm artifact for version `0.3.0` was broken. Do not use this specific version.
- gotcha This library requires TypeScript 2.2 or later. For TypeScript 2.1 compatibility, you must use version 0.2.0.
- gotcha When defining an enum using `Enum.ofKeys(object)`, the values of the enum are explicitly set to be identical to its keys, which is different from standard `Enum()` behavior where keys map to custom string values. This is for specific string comparison scenarios.
- gotcha For type-safety, it is crucial to define a TypeScript type alias using `type MyEnumType = Enum<typeof MyEnum>;` after creating an enum constant. Without this alias, TypeScript will treat assignments as potentially just 'string' rather than the narrow union type.
Install
-
npm install typescript-string-enums -
yarn add typescript-string-enums -
pnpm add typescript-string-enums
Imports
- Enum
const Enum = require('typescript-string-enums').Enum;import { Enum } from 'typescript-string-enums'; - MyEnum
import MyEnum from './my-enum-file';
import { MyEnum } from './my-enum-file'; - Enum<typeof MyEnum>
type MyEnumType = MyEnum;
type MyEnumType = Enum<typeof MyEnum>;
Quickstart
import { Enum } from "typescript-string-enums";
// Define an enum with mapped values and JSDoc comments
export const StatusCode = Enum({
/**
* The operation completed successfully.
*/
OK: "success",
/**
* An error occurred during the operation.
*/
ERROR: "failure",
PENDING: "in_progress",
});
// Create a type alias for compile-time type safety
export type StatusCode = Enum<typeof StatusCode>;
console.log(`OK status value: ${StatusCode.OK}`); // Expected: "success"
function processStatus(statusString: string) {
// Use Enum.isType as a type guard for runtime validation and type narrowing
if (Enum.isType(StatusCode, statusString)) {
// Inside this block, statusString is narrowed to StatusCode type
console.log(`Processing valid status: ${statusString}`);
if (statusString === StatusCode.OK) {
console.log("Operation was successful!");
} else if (statusString === StatusCode.ERROR) {
console.log("Operation failed.");
}
} else {
console.warn(`Invalid status received: ${statusString}`);
}
}
// Example usage with valid and invalid inputs
processStatus("success"); // Valid
processStatus("in_progress"); // Valid
processStatus("unknown_status"); // Invalid
// Demonstrating Enum.keys() and Enum.values()
const keys = Enum.keys(StatusCode);
console.log("Enum keys:", keys); // Expected: ["OK", "ERROR", "PENDING"]
const values = Enum.values(StatusCode);
console.log("Enum values:", values); // Expected: ["success", "failure", "in_progress"]