What is json-schema-to-typescript?
The json-schema-to-typescript npm package is a tool that converts JSON Schema definitions into TypeScript interfaces. This is particularly useful for ensuring type safety in TypeScript projects by generating types directly from JSON Schema, which can help in maintaining consistency between your data models and TypeScript types.
What are json-schema-to-typescript's main functionalities?
Convert JSON Schema to TypeScript Interface
This feature allows you to convert a JSON Schema into a TypeScript interface. The `compile` function takes a JSON Schema and a name for the resulting TypeScript interface, and returns a promise that resolves to the TypeScript code as a string.
const { compile } = require('json-schema-to-typescript');
const schema = {
title: 'Example Schema',
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' }
},
required: ['name', 'age']
};
compile(schema, 'ExampleSchema')
.then(ts => console.log(ts));
Generate TypeScript Definitions from Multiple Schemas
This feature allows you to generate TypeScript definitions from a JSON Schema file. The `compileFromFile` function reads a JSON Schema from a file and returns a promise that resolves to the TypeScript code as a string.
const { compileFromFile } = require('json-schema-to-typescript');
compileFromFile('path/to/schema.json')
.then(ts => console.log(ts));
Customizing Output
This feature allows you to customize the output of the TypeScript definitions. The `compile` function accepts an options object where you can specify various settings like adding a banner comment to the generated TypeScript code.
const { compile } = require('json-schema-to-typescript');
const schema = {
title: 'Example Schema',
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' }
},
required: ['name', 'age']
};
const options = {
bannerComment: '/* This is a generated file */'
};
compile(schema, 'ExampleSchema', options)
.then(ts => console.log(ts));
Other packages similar to json-schema-to-typescript
typescript-json-schema
The typescript-json-schema package generates JSON Schema from your TypeScript types. It works in the opposite direction compared to json-schema-to-typescript, making it useful for projects where you start with TypeScript types and need to generate JSON Schema for validation or documentation purposes.
quicktype
The quicktype package can generate TypeScript types from JSON Schema, JSON data, and other sources. It supports multiple languages and is highly configurable, making it a versatile tool for generating types from various data formats.
json-schema-to-flow-type
The json-schema-to-flow-type package converts JSON Schema to Flow types. While it serves a similar purpose to json-schema-to-typescript, it is specifically designed for projects using Flow instead of TypeScript.
json-schema-to-typescript
Compile JSON Schema to TypeScript typings.
Example
Check out the live demo.
Input:
{
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
},
"hairColor": {
"enum": ["black", "brown", "blue"],
"type": "string"
}
},
"additionalProperties": false,
"required": ["firstName", "lastName"]
}
Output:
export interface ExampleSchema {
firstName: string;
lastName: string;
age?: number;
hairColor?: "black" | "brown" | "blue";
}
Installation
npm install json-schema-to-typescript
Usage
json-schema-to-typescript is easy to use via the CLI, or programmatically.
CLI
First make the CLI available using one of the following options:
npm install json-schema-to-typescript
npm install json-schema-to-typescript --global
Then, use the CLI to convert JSON files to TypeScript typings:
cat foo.json | json2ts > foo.d.ts
json2ts foo.json > foo.d.ts
json2ts foo.yaml foo.d.ts
json2ts --input foo.json --output foo.d.ts
json2ts -i foo.json -o foo.d.ts
json2ts -i 'schemas/**/*.json'
json2ts -i schemas/ -o types/
You can pass any of the options described below (including style options) as CLI flags. Boolean values can be set to false using the no-
prefix.
json2ts -i foo.json -o foo.d.ts --unreachableDefinitions
json2ts -i foo.json -o foo.d.ts --style.singleQuote --no-style.semi
API
To invoke json-schema-to-typescript from your TypeScript or JavaScript program, import it and call compile
or compileFromFile
.
import { compile, compileFromFile } from 'json-schema-to-typescript'
compileFromFile('foo.json')
.then(ts => fs.writeFileSync('foo.d.ts', ts))
let mySchema = {
properties: [...]
}
compile(mySchema, 'MySchema')
.then(ts => ...)
See server demo and browser demo for full examples.
Options
compileFromFile
and compile
accept options as their last argument (all keys are optional):
key | type | default | description |
---|
additionalProperties | boolean | true | Default value for additionalProperties , when it is not explicitly set |
bannerComment | string | "/* eslint-disable */\n/**\n* This file was automatically generated by json-schema-to-typescript.\n* DO NOT MODIFY IT BY HAND. Instead, modify the source JSON Schema file,\n* and run json-schema-to-typescript to regenerate this file.\n*/" | Disclaimer comment prepended to the top of each generated file |
customName | (LinkedJSONSchema, string | undefined) => string | undefined | undefined | Custom function to provide a type name for a given schema |
cwd | string | process.cwd() | Root directory for resolving $ref s |
declareExternallyReferenced | boolean | true | Declare external schemas referenced via $ref ? |
enableConstEnums | boolean | true | Prepend enums with const ? |
inferStringEnumKeysFromValues | boolean | false | Create enums from JSON enums with eponymous keys |
format | boolean | true | Format code? Set this to false to improve performance. |
ignoreMinAndMaxItems | boolean | false | Ignore maxItems and minItems for array types, preventing tuples being generated. |
maxItems | number | 20 | Maximum number of unioned tuples to emit when representing bounded-size array types, before falling back to emitting unbounded arrays. Increase this to improve precision of emitted types, decrease it to improve performance, or set it to -1 to ignore maxItems . |
strictIndexSignatures | boolean | false | Append all index signatures with | undefined so that they are strictly typed. |
style | object | { bracketSpacing: false, printWidth: 120, semi: true, singleQuote: false, tabWidth: 2, trailingComma: 'none', useTabs: false } | A Prettier configuration |
unknownAny | boolean | true | Use unknown instead of any where possible |
unreachableDefinitions | boolean | false | Generates code for $defs that aren't referenced by the schema. |
$refOptions | object | {} | $RefParser Options, used when resolving $ref s |
Tests
$ npm test
Features
Custom schema properties:
tsType
: Overrides the type that's generated from the schema. Useful for forcing a type to any
or when using non-standard JSON schema extensions (eg).tsEnumNames
: Overrides the names used for the elements in an enum. Can also be used to create string enums (eg).
Not expressible in TypeScript:
FAQ
JSON-Schema-to-TypeScript is crashing on my giant file. What can I do?
Prettier is known to run slowly on really big files. To skip formatting and improve performance, set the format
option to false
.
Further Reading
Who uses JSON-Schema-to-TypeScript?