Runtime type checking library for TypeScript & JavaScript.
- Provides runtime type validation.
- Can derive static type from any type guard, thus types are never out of sync.
- Supports nested type guards.
- Supports almost all JS data types, including Promise, Proxy, DataView and typed arrays.
- Package has 0 dependency.
# npm
npm install @typeguards/core
# yarn
yarn add @typeguards/coreimport T from '@typeguards/core'
T.Number.validates(1) // true
T.Number.validates('1') // false
T.Optional(T.String).validates('1') // true
T.Optional(T.String).validates(undefined) // true
T.Optional(T.String).validates(1) // false
// Custom type guard
const Range = T.Number.config({
// Custom validation function
validate: value => typeof value === 'number' && value > 0 && value < 3,
})
Range.validate(0) // false
Range.validate(1) // true
Range.validate(2) // true
Range.validate(3) // falseimport type { Static } from '@typeguards/core'
import T, { createSchema } from '@typeguards/core'
const Age = T.Number.config({ validate: v => typeof v === 'number' && v >= 0 })
// Custom schema
const JobSchema = T.Schema({
title: T.String,
salary: T.Nullable(T.Number),
})
// Use closure to use type guard directly & prevent naming conflicts with JS built-in objects
const PersonSchema = createSchema(({ Boolean, String, Number, Array, Optional, Union }) => ({
name: String,
age: Age,
alive: Boolean,
address: Optional(String),
// Support complex nested type guard
favorites: Array(Union(String, Number)),
// Support nested schema
job: JobSchema,
}))
// Support static type derivation, thus type is never out of sync
const person: Static<typeof PersonSchema> = {
name: 'John Doe',
age: 23,
alive: true,
address: undefined,
favorites: ['cat', 'dog', 7],
job: {
title: 'Dreamer',
salary: null,
},
}
PersonSchema.validate(person) // true
PersonSchema.validate({ ...person, address: undefined }) // true, because address is optional
PersonSchema.validate({ ...person, name: undefined }) // false
PersonSchema.validate({ ...person, age: '23' }) // false
const CatSchema = T.Partial(T.Pick(PersonSchema, ['name', 'age', 'alive']))
// Equivalent to Partial<Pick<PersonType, 'name' | 'age' | 'alive'>>
type Cat = Static<typeof CatSchema>
CatSchema.validate(person) // false
CatSchema.validate({ name: 'Baby', age: undefined }) // true
// Retrieve Schema definition
const catDefinition = CatSchema.definition() // { name: String, age: Age, alive: Boolean }
// Retrieve Indexed access type definition, which is a type guard in this case
const CatName = CatSchema.definition('name') // T.String
CatName.validate('str') // true
catDefinition.name.validate('str') // trueimport T from '@typeguards/core'
// Customize transformation function
const Name = T.String.config({ transform: val => `${val} Jr.` })
const Alive = T.Boolean.config({ transform: val => val ?? true })
const Person = T.Partial(T.Schema({ name: Name, alive: Alive }))
const john = { name: 'John' }
Person.validate(john) // true
const johnJr = Person.transform(john) // { name: 'John Jr.', alive: true }| name | description |
|---|---|
| Boolean | |
| StringBoolean | "true" | "TRUE" | "false" | "FALSE" | "1" | "0" |
| Number | |
| NaN | NaN |
| PositiveNumber | A number value that's greater than 0 |
| NegativeNumber | A number value that's less than 0 |
| BigInt | |
| PositiveBigInt | A BigInt value that's greater than 0 |
| NegativeBigInt | A BigInt value that's less than 0 |
| StringNumber | A string whose value is a number, such as "0", "-1", "3.333" |
| String | |
| NonEmptyString | A string that's not empty even after trimming |
| Symbol | |
| Undefined | undefined |
| Null | null |
| Object | An object (Any object will qualify as long as typeof obj === 'object') |
| RegExp | |
| Map | |
| WeakMap | |
| Set | |
| WeakSet | |
| Promise | |
| Proxy | |
| Date | |
| StringDate | A correctly formatted date string, such as "1996-07-23", "1996/07/23", "1996 Jul", "1996" |
| Array | |
| StringArray | A string whose value is an array separated by delimiter "," (delimiter is customizable) |
| ArrayBuffer | |
| SharedArrayBuffer | |
| DataView | |
| Int8Array | |
| Uint8Array | |
| Uint8ClampedArray | |
| Int16Array | |
| Uint16Array | |
| Int32Array | |
| Uint32Array | |
| Float32Array | |
| Float64Array | |
| BigInt64Array | |
| BigUint64Array | |
| Function | A function |
| Schema | A plain object |
| Optional | T | undefined |
| Nullable | T | null |
| Never | Equivalent of TypeScript never type |
| Unknown | Equivalent of TypeScript unknown type |
| Any | Equivalent of TypeScript any type |
| Record | Equivalent of TypeScript Record type |
| Partial | Equivalent of TypeScript Partial type |
| Required | Equivalent of TypeScript Required type |
| Pick | Equivalent of TypeScript Pick type |
| Omit | Equivalent of TypeScript Omit type |
| NonNullable | Equivalent of TypeScript NonNullable type |
| Union | Equivalent of TypeScript union type |
| Const | Equivalent of TypeScript const assertion |
| GeneratorFunction | Requires ES6/ES2015 or later |
| Generator | Requires ES6/ES2015 or later |
| AsyncFunction | Requires ES8/ES2017 or later |