sinclairzx81 / typebox

Json Schema Type Builder with Static Type Resolution for TypeScript
Other
4.56k stars 148 forks source link

How to import just Decode? #876

Closed GorvGoyl closed 1 month ago

GorvGoyl commented 1 month ago
import { Value } from '@sinclair/typebox/value';
 const appSettings = Value.Decode(AppSettings, body);

Is there a way to just use Decode for better tree shaking?

I tried importing like this but it gave build error:

import { Decode } from '@sinclair/typebox/build/cjs/value/value/value';
sinclairzx81 commented 1 month ago

@GorvGoyl Hi,

This part of the API is a little bit in flux currently, however you can import the TransformDecode function which performs the interior decode op, but not the check. You can wire this up into a custom Parse function as follows (which should tree shake for other functionality)

import { Type, TSchema, StaticDecode } from '@sinclair/typebox'
import { Check, TransformDecode } from '@sinclair/typebox/value'
import { Errors } from '@sinclair/typebox/errors'

const T = Type.Object({
  x: Type.Number(),
  y: Type.Number(),
  z: Type.Number()
})

export function Parse<T extends TSchema, D = StaticDecode<T>>(schema: T, value: unknown): D {
  if(!Check(schema, value)) throw new Error('Invalid value', { cause: Errors(schema, value).First() })
  return TransformDecode(schema, [], value) as D
}

const value = Parse(T, { x: 1, y: 2, z: 3 })

console.log(value)

The TransformDecode function is currently treated as an internal function but would like to promote this API as the preferred Decode function in later revisions. The function returns unknown (so you need to type assert the return value) and expects the value to be checked before calling it (as above).

Hope this helps S

sinclairzx81 commented 1 month ago

@GorvGoyl Hiya,

Might close off this issue. As above you can import TransformDecode which should provide the functionality you need, just be sure to Check the value prior to calling the function.

If you have any follow up questions, feel free to ping on this thread

Cheers S

GorvGoyl commented 1 month ago

Thanks. this seems a bit much for such common use case. Would you consider providing one simple function to achieve this?

sinclairzx81 commented 1 month ago

Thanks. this seems a bit much for such common use case. Would you consider providing one simple function to achieve this?

Yes, I'm planning to sort this out on the next minor revision.