json-schema-to-typescript
Compile json schema to typescript typings
Example
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
yarn add json-schema-to-typescript
npm install json-schema-to-typescript --save
Usage
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 JSONSchema file,\n* and run json-schema-to-typescript to regenerate this file.\n*/" | Disclaimer comment prepended to the top of each generated file |
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 ? |
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 |
CLI
A CLI utility is provided with this package.
cat foo.json | json2ts > foo.d.ts
json2ts foo.json > foo.d.ts
json2ts foo.json 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 above (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
Tests
npm test
Features
Custom schema properties:
tsType
:- string: 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) - object:
module
: import path to usename
: name of the importdefaultExport
: import from default exporttypeOnly
: import only as type
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?