@nlib/typing

1.1.0 • Public • Published

@nlib/typing

TypeScript utilities

test codecov

import {
  createTypeChecker,
  isString,
  isNonNegativeSafeInteger,
  ensure,
} from '@nlib/typing';

/** createTypeChecker defines a schema */
const isMyObject = createTypeChecker('MyObject', {
  id: isString,
  name: isString,
  age: isNonNegativeSafeInteger,
});

/**
 * TypeChecker is a [type guard](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)
 * `(input: unknown) => input is {id: string, name: string, age: number}`
 */
console.info(isMyObject({ id: '001', name: 'a', age: 1 })); // → true
console.info(isMyObject({ id: '001', name: 'a' })); // → false

/** You can handle a response with confidence */
const response = await fetch('/myobjects/001');
const result = ensure(await response.json(), isMyObject);
console.info(result.id, result.name, result.age);

/** TypeCheckers has some derivations: `.array`, `.dictionary`, `.optional` */
const response2 = await fetch('/myobjects');
const result = ensure(await response2.json(), isMyObject.array);
console.info(result); // → [{id: '001', name: 'a', age: 1}, ...]

const dictionary = {
  a: { id: '001', name: 'a', age: 1 },
  b: { id: '002', name: 'b', age: 2 },
  c: { id: '003', name: 'c', age: 3 },
};
isMyObject.dictionary(dictionary); // → true

const isMyObject2 = createTypeChecker('MyObject', {
  title: isString,
  /** object is {id: string, name: string, age: number} | undefined */
  object: isMyObject.optional,
});

/** You can extend an existing schema */
const isExtendedMyObject = createTypeChecker('ExtendedMyObject', {
  ...isMyObject.definition,
  description: isString,
});

/@nlib/typing/

    Package Sidebar

    Install

    npm i @nlib/typing

    Weekly Downloads

    389

    Version

    1.1.0

    License

    Apache-2.0

    Unpacked Size

    412 kB

    Total Files

    347

    Last publish

    Collaborators

    • kei-ito