UNPKG

zod-to-ts

Version:

generate TypeScript types from your Zod schema

42 lines (41 loc) 1.69 kB
import ts, { factory as f } from 'typescript'; export function handleUnrepresentable(unrepresentable, unrepresentableType) { if (unrepresentable === 'any') { return f.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); } throw new Error(`Schemas of type "${unrepresentableType}" cannot be represented in TypeScript`); } export function createAuxiliaryTypeStore() { let id = 0; return { nextId() { const currentId = id; id++; return `Auxiliary_${currentId}`; }, definitions: new Map(), }; } export function literalValueToLiteralType(literalValue) { switch (typeof literalValue) { case 'string': return f.createLiteralTypeNode(f.createStringLiteral(literalValue)); case 'number': if (literalValue < 0) { return f.createLiteralTypeNode(f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(Math.abs(literalValue)))); } return f.createLiteralTypeNode(f.createNumericLiteral(literalValue)); case 'bigint': return f.createLiteralTypeNode(f.createBigIntLiteral(`${literalValue.toString()}n`)); case 'boolean': return literalValue === true ? f.createLiteralTypeNode(f.createTrue()) : f.createLiteralTypeNode(f.createFalse()); case 'object': if (literalValue === null) return f.createLiteralTypeNode(f.createNull()); throw new Error('Object literals are not supported'); case 'undefined': return f.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword); } }