npm
11.0.2 • Public • Published a month ago
- Readme
- Explore BETA
- 14 Dependencies
- 344 Dependents
- 94 Versions
Compile json schema to
typescript typings Input: json-schema-to-typescript
Example
{ "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 in years */ age?: number; hairColor?: "black" | "brown" | "blue"; }
Installation
# Using Yarn: yarn add json-schema-to-typescript # Or, using NPM: npm install json-schema-to-typescript --save
Usage
import { compile, compileFromFile } from 'json-schema-to-typescript' // compile from file compileFromFile('foo.json') .then(ts => fs.writeFileSync('foo.d.ts', ts)) // or, compile a JS object 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):
additionalProperties | boolean | true | Default value for additionalProperties, when it is not explicitly set |
bannerComment | string | "/* tslint: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 $refs |
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. |
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 definitions that aren't referenced by the schema. |
strictIndexSignatures | boolean | false | Append all index signatures with | undefined so that they are strictly typed. |
$refOptions | object | {} | $RefParser Options, used when resolving $refs |
CLI
A CLI utility is provided with this package.
cat foo.json | json2ts > foo.d.ts # or json2ts foo.json > foo.d.ts # or json2ts foo.json foo.d.ts # or json2ts --input foo.json --output foo.d.ts # or json2ts -i foo.json -o foo.d.ts # or (quote globs so that your shell doesn't expand them) json2ts -i 'schemas/**/*.json' # or 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.
# generate code for definitions that aren't referenced json2ts -i foo.json -o foo.d.ts --unreachableDefinitions # use single quotes and disable trailing semicolons json2ts -i foo.json -o foo.d.ts --style.singleQuote --no-style.semi
Tests
npm test
Features
- [x] title => interface
- [x] Primitive types:
- [x] array
- [x] homogeneous array
- [x] boolean
- [x] integer
- [x] number
- [x] null
- [x] object
- [x] string
- [x] homogeneous enum
- [x] heterogeneous enum
- [x] Non/extensible interfaces
- [ ] Custom JSON-schema extensions
- [x] Nested properties
- [x] Schema definitions
- [x] Schema references
- [x] Local (filesystem) schema references
- [x] External (network) schema references
- [x] Add support for running in browser
- [x] default interface name
- [x] infer unnamed interface name from filename
- [x] allOf ("intersection")
- [x] anyOf ("union")
- [x] oneOf (treated like anyOf)
- [x] maxItems (eg)
- [x] minItems (eg)
- [x] additionalProperties of type
- [x] patternProperties (partial support)
- [x] extends
- [x] required properties on objects (eg)
- [ ] validateRequired (eg)
- [x] literal objects in enum (eg)
- [x] referencing schema by id (eg)
- [x] custom typescript types via tsType
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:
- dependencies (single, multiple)
- divisibleBy (eg)
- format (eg)
- multipleOf (eg)
- maximum (eg)
- minimum (eg)
- maxProperties (eg)
- minProperties (eg)
- not/disallow
- oneOf ("xor", use anyOf instead)
- pattern (string, regex)
- uniqueItems (eg)
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
- JSON-schema spec: //tools.ietf.org/html/draft-zyp-json-schema-04
- JSON-schema wiki: //github.com/json-schema/json-schema/wiki
- JSON-schema test suite: //github.com/json-schema/JSON-Schema-Test-Suite/blob/node
- TypeScript spec: //github.com/Microsoft/TypeScript/blob/master/doc/spec.md
Who uses JSON-Schema-to-TypeScript?
- Alibaba
- Amazon, AWSLabs
- Expo
- FormatJS
- Microsoft
- Mozilla
- Nx
- RStudio
- Sourcegraph
- Stryker
- Webpack
- See more