Automatically generate Typescript Definition files or Flow types from JSON input


Keywords
json, typescript, flow, types, interfaces
Install
npm install json-ts@1.6.4

Documentation

Build Status

npm install -g json-ts

Automatically generate Typescript Definition files or Flow types from JSON input.

Use it via the API, CLI, or Website

json-ts

How does json-ts stack up against the competition?

Feature json-ts (this library) json-to-ts json2ts
simple literal types (number, string etc) YES YES YES
array type, all elements of same kind YES YES YES
merge multiple json files YES (cli, v1.6 & above) NO NO
optional members YES YES NO
array union types YES YES NO
correct handling of top-level values (strings, arrays, arrays of objects, numbers etc) YES NO NO
recursive data structures (see here) YES NO NO
nested type literals (to account for invalid interface names) YES YES NO
output @flow types YES NO NO
Website YES YES YES
CLI YES NO NO
API YES YES NO

Quick-start

# install
npm install -g json-ts

# run against a single JSON file
json-ts dir/myfile.json

# run against multiple single JSON files (interfaces will be merged)
json-ts api/resp1.json api/resp2.json

Usage (CLI)

Note: only stdin (which requires the --stdin flag) & filepaths are supported right now. Later I will add support for Windows, reading data from network requests etc.

## piping via stdin
curl https://jsonplaceholder.typicode.com/posts/1 | json-ts --stdin

## reading single json file from disk
json-ts my-file.json

## reading multiple json files from disk
json-ts my-file.json my-other-file.json

... produces the following:

interface IRootObject {
  userId: number;
  id: number;
  title: string;
  body: string;
}

Usage (API)

npm install json-ts --save-dev
const { json2ts } = require('json-ts');
const json = `
{
    "name": "Shane"
}
`;
console.log(json2ts(json))

... produces the following:

interface IRootObject {
  name: string;
}

For more examples, see the Tests

Options

  • namespace: string - if provided, interfaces will be wrapped in a namespace (see below)
    # usage
    json-ts <filename> --namespace <namespace_name> 
    
    # example
    json-ts data/my-file.json --namespace API
  • flow: boolean - output types in Flow format.
    # usage
    json-ts <filename> --flow 
    
    # example
    json-ts data/my-file.json --flow
  • prefix: string - override the I prefix on interface names
    # usage
    json-ts <filename> --prefix <prefix_string> 
    
    # example (remove prefix)
    json-ts data/my-file.json --prefix ""
  • rootName: string - override the RootObject name of the top-level interface
    # usage
    json-ts <filename> --rootName <rootname_string> 
    
    # example
    json-ts data/my-file.json --rootName "Product"

TODO:

options

  • Allow choice of I prefix on interface names
  • Allow naming of RootObject
  • Allow choice of spaces/tabs

Core

  • support array types
  • support boolean types
  • support null types
  • output types for Flow via --flow
  • PascalCase as default for all interface names
  • de-dupe interfaces (it's dumb atm, POC)
  • de-dupe interfaces where propname differs, but members are the same
  • merge interfaces by creating union types for members
  • union types for array that contain mixed literal types: nums: [1, "2"] -> nums: number|string[] (already works for complex objects)
  • quoted member names when needed
  • handle invalid name for interface
  • support type alias declarations
  • Use Typescript factory methods/printer for output
  • Allow wrapping in namespace: eg:
        declare namespace Projects {
            export interface ILoc {
               lat: number;
               lng: number;
            }
            ...
        }

CLI

  • CLI tool to accept stdin (with --stdin flag)
  • CLI tool to accept json file as input
  • CLI tool to accept URL as input (for validating against remote API)
  • configurable output (filename/stdout etc)