Validate untyped data and return well typed result.
- This package has no dependencies.
npm i @xieyuheng/ty
import ty, { Obtain } from "@xieyuheng/ty"
const userSchema = ty.object({
id: ty.int({ min: 0 }),
first_name: ty.string(),
last_name: ty.string(),
})
type User = Obtain<typeof userSchema>
// NOTE We can extract a `User` type from the type of `userSchema`,
// which will be the same as the following type definition:
// type User = {
// id: number
// first_name: string
// last_name: string
// }
{
const data: any = {
id: 1,
first_name: "Yuheng",
last_name: "Xie",
}
const user: User = userSchema.validate(data)
}
type List<T> = null | { head: T; tail: List<T> }
function cons<T>(head: T, tail: List<T>): List<T> {
return { head, tail }
}
function listSchema<T>(itemSchema: Schema<T>): Schema<List<T>> {
const nullSchema = ty.null()
const consSchema = ty.object({
head: itemSchema,
tail: ty.lazy(() => listSchema(itemSchema)),
})
return ty.union(nullSchema, consSchema)
}
{
const schema = listSchema(ty.string())
const data0: List<string> = schema.validate(null)
const data1: List<string> = schema.validate(cons("a", null))
const data2: List<string> = schema.validate(cons("a", cons("b", null)))
const data3: List<string> = schema.validate(
cons("a", cons("b", cons("c", null))),
)
schema.expectInvalid(cons(1, null))
schema.expectInvalid(cons(1, cons(2, null)))
schema.expectInvalid(cons(1, cons(2, cons(3, null))))
}
{
const schema = listSchema(ty.number())
const data0: List<number> = schema.validate(null)
const data1: List<number> = schema.validate(cons(1, null))
const data2: List<number> = schema.validate(cons(1, cons(2, null)))
const data3: List<number> = schema.validate(cons(1, cons(2, cons(3, null))))
schema.expectInvalid(cons("a", null))
schema.expectInvalid(cons("a", cons("b", null)))
schema.expectInvalid(cons("a", cons("b", cons("c", null))))
}
Primitive:
Collection:
Set-Theoretic:
Structural:
Recursion:
To make a contribution, fork this project and create a pull request.
Please read the STYLE-GUIDE.md before you change the code.
Remember to add yourself to AUTHORS. Your line belongs to you, you can write a little introduction to yourself but not too long.