Essential utilities for TypeScript projects
Ideas for additional essential utilities welcome. Type-only utilities belong in type-fest.
npm install ts-extras
import {isDefined} from 'ts-extras';
[1, undefined, 2].filter(isDefined);
//=> [1, 2]
General
asWritable - Cast the given value to be Writable.safeCastTo - Constrain a value to the given type safely.Type guard
isDefined - Check whether a value is defined (not undefined).isEqualType - Check if two types are equal at compile time.isPresent - Check whether a value is present (not null nor undefined).isEmpty - Check whether an array is empty.isFinite - A strongly-typed version of Number.isFinite().isInfinite - Check whether a value is infinite.isInteger - A strongly-typed version of Number.isInteger().isSafeInteger - A strongly-typed version of Number.isSafeInteger().keyIn - Check if a key is in an object and narrow the key to the object's keys.not - Invert a type predicate function.objectHasIn - Check if an object has a property (including inherited) and narrow the object type.assertDefined - Assert that the given value is defined, meaning it is not undefined.assertPresent - Assert that the given value is present (non-nullable), meaning it is neither null nor undefined.assertError - Assert that the given value is an Error.Improved builtin
arrayAt - A strongly-typed version of Array#at() with improved tuple support (supports -1 and positive literal indices for tuples).arrayConcat - A strongly-typed version of Array#concat() that properly handles arrays of different types.arrayFirst - Return the first item of an array with stronger typing for tuples.arrayIncludes - A strongly-typed version of Array#includes() that properly acts as a type guard.arrayLast - Return the last item of an array with stronger typing for tuples.objectKeys - A strongly-typed version of Object.keys().objectEntries - A strongly-typed version of Object.entries().objectFromEntries - A strongly-typed version of Object.fromEntries().objectHasOwn - A strongly-typed version of Object.hasOwn().setHas - A strongly-typed version of Set#has() that properly acts as a type guard.stringSplit - A strongly-typed version of String#split() that returns a tuple for literal strings.keyIn, objectHasIn, and objectHasOwn?These functions solve different problems despite all checking property existence:
keyIn - Key narrowing for union types:
in operator, checking the prototype chain__proto__ and constructor for securityobjectHasIn - Object narrowing with prototype chain:
in operator, checking the prototype chain__proto__ and constructor for securityobjectHasOwn - Object narrowing for own properties:
Object.hasOwn(), checking only own properties// keyIn - narrows the key (prototype chain)
const key = 'foo' as 'foo' | 'bar' | 'baz';
if (keyIn(object, key)) {
// `key` is now: 'foo' | 'bar' (only existing keys)
console.log(object[key]); // Safe
}
// objectHasIn - narrows the object (prototype chain)
const data: unknown = {foo: 1};
if (objectHasIn(data, 'toString')) {
// `data` is now: unknown & {toString: unknown}
console.log(data.toString); // Safe (inherited method)
}
// objectHasOwn - narrows the object (own properties only)
if (objectHasOwn(data, 'foo')) {
// `data` is now: unknown & {foo: unknown}
console.log(data.foo); // Safe (own property)
}
type-fest?The type-fest package contains only types, meaning they are only used at compile-time and nothing is ever compiled into actual JavaScript code. This package contains functions that are compiled into JavaScript code and used at runtime.
type-fest's CamelCasedPropertiesDeep)