@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,
});

Readme

Keywords

none

Package Sidebar

Install

npm i @nlib/typing

Weekly Downloads

148

Version

1.1.0

License

Apache-2.0

Unpacked Size

412 kB

Total Files

347

Last publish

Collaborators

  • kei-ito