bcherny / json-schema-to-typescript

Compile JSON Schema to TypeScript type declarations
https://bcherny.github.io/json-schema-to-typescript-browser/
MIT License
2.94k stars 391 forks source link

Translate `oneOf` to a discriminated union type #343

Open JbIPS opened 4 years ago

JbIPS commented 4 years ago

The oneOf properties is described in README as Not expressible in TypeScript.

I recently discovered the discriminated union type with a mutual exclusion, which fit perfectly with a XOR:

type MenuItemXor = {
    title: string;
    icon: string;
} & (
        | { component: object; click?: never }
        | { component?: never; click: boolean }
    )

let testXor: MenuItemXor;
testXor = { title: "t", icon: "i" } // error, none are set
testXor = { title: "t", icon: "i", component: {} } // ✔
testXor = { title: "t", icon: "i", click: true } // ✔
testXor = { title: "t", icon: "i", click: true, component: {} } // error, both are set

This is well explained in this SO answer and seems to me a perfect fit for oneOf.

I can work on a PR if you feel OK with this feature.

bcherny commented 3 years ago

Hey there! Want to flesh this idea out a bit more? What are some example JSON-Schema inputs, and what outputs will you generate? I'd love to see how this might work for: