https://github.com/keplr-team/typed-ajv
  
  
    Define TypeScript types and JSON Schema schemas from the same declarations 
    https://github.com/keplr-team/typed-ajv
  
backend
        Last synced: 7 months ago 
        JSON representation
    
Define TypeScript types and JSON Schema schemas from the same declarations
- Host: GitHub
- URL: https://github.com/keplr-team/typed-ajv
- Owner: keplr-team
- License: mit
- Created: 2019-02-25T14:49:59.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-03-01T07:35:05.000Z (over 1 year ago)
- Last Synced: 2024-10-04T13:35:58.858Z (about 1 year ago)
- Topics: backend
- Language: TypeScript
- Homepage:
- Size: 1.47 MB
- Stars: 18
- Watchers: 3
- Forks: 0
- Open Issues: 19
- 
            Metadata Files:
            - Readme: README.md
- License: LICENSE
 
Awesome Lists containing this project
README
          # typed-ajv
Define TypeScript types and JSON Schema schemas from the same declaration.
## Getting started
Define your schema:
```typescript
const cs = CS.Object({
  a: CS.String(true),
  b: CS.Number(false),
});
```
Get the type:
```typescript
type Type = typeof cs.type; // { a: string, b?: number }
```
Get the json schema:
```typescript
const jsonSchema = cs.getJsonSchema(); // { type: 'object', properties: [...] }
```
Validate your input data and type it :
```typescript
if (ajv.validate(jsonSchema, inputData)) {
  const data: Type = inputData;
}
```
## Supported primitive types
| Type    | Description                 |
| ------- | --------------------------- |
| Any     | Anything                    |
| Boolean |
| Const   | Constant of any type        |
| Integer | An integer type as `number` |
| Number  |
| String  |
| Unknown | Anything typed as `unknown` |
| Null    | Only `null`                 |
## Supported compound types
| Type         | Description                                                                |
| ------------ | -------------------------------------------------------------------------- |
| AnyOf        | Any type within a selection of definitions                                 |
| Array        | An array of a type                                                         |
| Enum         | A string with enumerated values                                            |
| Object       | An object with typed properties                                            |
| MergeObjects | Merge two object definitions into one object containing all the properties |
## Helpers
| Type     | Description                                   | Example                                           |
| -------- | --------------------------------------------- | ------------------------------------------------- |
| Required | Changes the type of the schema to be required | CS.Required(CS.String(false)) === CS.String(true) |
| Optional | Changes the type of the schema to be optional | CS.Optional(CS.String(true)) === CS.String(false) |
## Using AnyOf with objects and `removeAdditional: true`
`AnyOf`, when ajv is configured with `removeAdditional: true`, doesn't behave the expected way. For example :
```ts
CS.AnyOf(
  [
    CS.Object(
      { type: CS.Enum(['car'] as const, true), wheels: CS.Number(true) },
      true,
    ),
    CS.Object(
      { type: CS.Enum(['horse'] as const, true), legs: CS.Number(true) },
      true,
    ),
  ],
  true,
);
```
The above schema will unexpectedly fail to validate `{type: 'horse', legs: 4}` because, when evaluating the 'car' option, ajv will remove all the properties except `type` and `wheels`. Thus the 'horse' option will be evaluated with the `legs` property removed and fail to validate.
For the above schema to work as expected, use the discriminator option:
```ts
CS.AnyOf(
  [
    CS.Object(
      { type: CS.Enum(['car'] as const, true), wheels: CS.Number(true) },
      true,
    ),
    CS.Object(
      { type: CS.Enum(['horse'] as const, true), legs: CS.Number(true) },
      true,
    ),
  ],
  true,
  { discriminator: 'type' },
);
```
Ajv will also need to be initialized with the `discriminator: true` option.