ArkType: TypeScript's 1:1 validator, optimized from editor to runtime

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

Our great sponsors
  • SurveyJS - Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App
  • WorkOS - The modern identity platform for B2B SaaS
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • arktype

    TypeScript's 1:1 validator, optimized from editor to runtime

  • Hey everyone! I started working on ArkType about 15 months ago, which at the time was an experiment to determine whether a TypeScript syntax parser written using TS's own generic types could be performant.

    To my surprise, after a few months of iteration, it turned out it was possible to parse and provide fluid completions for scopes consisting of hundreds of cyclic types (see https://arktype.io/img/typePerf.mp4).

    At this point, I started working on an "isomorphic" parser that would allow definitions that looked like native TypeScript syntax to be parsed and enforced at compile-time via TS and at runtime in JavaScript using parallel static and dynamic implementations (see https://github.com/arktypeio/arktype#how). This includes syntactic and semantic validation that your editor can update in real-time as you write a definition (if you want you can try messing around with a definition and corresponding input data in-browser at https://arktype.io/try).

    Though as a full type system the library has lots of potential applications, the most obvious is for type-safe data validation as an alternative to approaches like Zod that rely on chained functions. Honestly I just think the fact that TypeScript can parse itself is cool in its own right, but given the prevalence of questions about how ArkType is different/better than existing libraries, I've taken the liberty of summarizing a few of what I believe are the most compelling points preemptively:

    - Having definitions that are inferred 1:1 means you'll be hovering to see types less

    - Most definitions are just objects and strings and can be easily serialized and eventually could even be used to validate data across multiple languages. Validators that rely on chaining will never be able to do this.

    - On average, definitions are about 50% shorter than traditional chained syntax.

    - Zod recently announced they were deprecating discriminated unions (see https://github.com/colinhacks/zod/issues/2106) because it was hard to maintain given their architecture. Not only are they supported in `arktype`, they're supported implicitly- you don't even have to tell us what keys to look at.

    - The discriminated unions point is really just a special case of a much more general advantage: `arktype` is not just a validator- it's a type system. If we can deeply intersect arbitrary types, optimize them, and determine assignability, we can use all of that to make discrimination much easier (being able to "discriminate" is equivalent to having some common path that has an intersection of `never`)

    - Zod claims it's impossible to infer recursive types due to a limitation of TS (see https://zod.dev/?id=recursive-types) and cannot handle cyclic data. ArkType can directly infer cyclic and recursive types and validate cyclic data.

    The point of this is not to say Zod is not a good library. It significantly improved inference capabilities and DX relative to the previous generation of validators like Yup. It also still has some features we haven't yet implemented (primarily stuff like `pick` and `merge` as I'm working on adding support for generics).

    Plus, we're still on `1.0.9-alpha`, so if I needed a validator for my critical production software, I'd probably go with `zod`.

    That said, I do think `arktype` has some fundamental advantages that mean in the long term, it's a better approach to invest in. My current focus in preparing for a stable release is adding docs, optimizing runtime perf, and publishing benchmarks (using similar techniques to https://github.com/sinclairzx81/typebox, so should land somewhere between 50-100x faster than non-optimized validators like Zod).

    Do you think that makes sense as a next priority? Do you think any of this makes sense at all, or have I just been coding in TS's type system long enough that my sanity has begun to erode? Agree or not with any of it, I'd love to hear your thoughts :-)

    - David

  • zod

    TypeScript-first schema validation with static type inference

  • Hey everyone! I started working on ArkType about 15 months ago, which at the time was an experiment to determine whether a TypeScript syntax parser written using TS's own generic types could be performant.

    To my surprise, after a few months of iteration, it turned out it was possible to parse and provide fluid completions for scopes consisting of hundreds of cyclic types (see https://arktype.io/img/typePerf.mp4).

    At this point, I started working on an "isomorphic" parser that would allow definitions that looked like native TypeScript syntax to be parsed and enforced at compile-time via TS and at runtime in JavaScript using parallel static and dynamic implementations (see https://github.com/arktypeio/arktype#how). This includes syntactic and semantic validation that your editor can update in real-time as you write a definition (if you want you can try messing around with a definition and corresponding input data in-browser at https://arktype.io/try).

    Though as a full type system the library has lots of potential applications, the most obvious is for type-safe data validation as an alternative to approaches like Zod that rely on chained functions. Honestly I just think the fact that TypeScript can parse itself is cool in its own right, but given the prevalence of questions about how ArkType is different/better than existing libraries, I've taken the liberty of summarizing a few of what I believe are the most compelling points preemptively:

    - Having definitions that are inferred 1:1 means you'll be hovering to see types less

    - Most definitions are just objects and strings and can be easily serialized and eventually could even be used to validate data across multiple languages. Validators that rely on chaining will never be able to do this.

    - On average, definitions are about 50% shorter than traditional chained syntax.

    - Zod recently announced they were deprecating discriminated unions (see https://github.com/colinhacks/zod/issues/2106) because it was hard to maintain given their architecture. Not only are they supported in `arktype`, they're supported implicitly- you don't even have to tell us what keys to look at.

    - The discriminated unions point is really just a special case of a much more general advantage: `arktype` is not just a validator- it's a type system. If we can deeply intersect arbitrary types, optimize them, and determine assignability, we can use all of that to make discrimination much easier (being able to "discriminate" is equivalent to having some common path that has an intersection of `never`)

    - Zod claims it's impossible to infer recursive types due to a limitation of TS (see https://zod.dev/?id=recursive-types) and cannot handle cyclic data. ArkType can directly infer cyclic and recursive types and validate cyclic data.

    The point of this is not to say Zod is not a good library. It significantly improved inference capabilities and DX relative to the previous generation of validators like Yup. It also still has some features we haven't yet implemented (primarily stuff like `pick` and `merge` as I'm working on adding support for generics).

    Plus, we're still on `1.0.9-alpha`, so if I needed a validator for my critical production software, I'd probably go with `zod`.

    That said, I do think `arktype` has some fundamental advantages that mean in the long term, it's a better approach to invest in. My current focus in preparing for a stable release is adding docs, optimizing runtime perf, and publishing benchmarks (using similar techniques to https://github.com/sinclairzx81/typebox, so should land somewhere between 50-100x faster than non-optimized validators like Zod).

    Do you think that makes sense as a next priority? Do you think any of this makes sense at all, or have I just been coding in TS's type system long enough that my sanity has begun to erode? Agree or not with any of it, I'd love to hear your thoughts :-)

    - David

  • SurveyJS

    Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App. With SurveyJS form UI libraries, you can build and style forms in a fully-integrated drag & drop form builder, render them in your JS app, and store form submission data in any backend, inc. PHP, ASP.NET Core, and Node.js.

    SurveyJS logo
  • typebox

    Json Schema Type Builder with Static Type Resolution for TypeScript

  • Hey everyone! I started working on ArkType about 15 months ago, which at the time was an experiment to determine whether a TypeScript syntax parser written using TS's own generic types could be performant.

    To my surprise, after a few months of iteration, it turned out it was possible to parse and provide fluid completions for scopes consisting of hundreds of cyclic types (see https://arktype.io/img/typePerf.mp4).

    At this point, I started working on an "isomorphic" parser that would allow definitions that looked like native TypeScript syntax to be parsed and enforced at compile-time via TS and at runtime in JavaScript using parallel static and dynamic implementations (see https://github.com/arktypeio/arktype#how). This includes syntactic and semantic validation that your editor can update in real-time as you write a definition (if you want you can try messing around with a definition and corresponding input data in-browser at https://arktype.io/try).

    Though as a full type system the library has lots of potential applications, the most obvious is for type-safe data validation as an alternative to approaches like Zod that rely on chained functions. Honestly I just think the fact that TypeScript can parse itself is cool in its own right, but given the prevalence of questions about how ArkType is different/better than existing libraries, I've taken the liberty of summarizing a few of what I believe are the most compelling points preemptively:

    - Having definitions that are inferred 1:1 means you'll be hovering to see types less

    - Most definitions are just objects and strings and can be easily serialized and eventually could even be used to validate data across multiple languages. Validators that rely on chaining will never be able to do this.

    - On average, definitions are about 50% shorter than traditional chained syntax.

    - Zod recently announced they were deprecating discriminated unions (see https://github.com/colinhacks/zod/issues/2106) because it was hard to maintain given their architecture. Not only are they supported in `arktype`, they're supported implicitly- you don't even have to tell us what keys to look at.

    - The discriminated unions point is really just a special case of a much more general advantage: `arktype` is not just a validator- it's a type system. If we can deeply intersect arbitrary types, optimize them, and determine assignability, we can use all of that to make discrimination much easier (being able to "discriminate" is equivalent to having some common path that has an intersection of `never`)

    - Zod claims it's impossible to infer recursive types due to a limitation of TS (see https://zod.dev/?id=recursive-types) and cannot handle cyclic data. ArkType can directly infer cyclic and recursive types and validate cyclic data.

    The point of this is not to say Zod is not a good library. It significantly improved inference capabilities and DX relative to the previous generation of validators like Yup. It also still has some features we haven't yet implemented (primarily stuff like `pick` and `merge` as I'm working on adding support for generics).

    Plus, we're still on `1.0.9-alpha`, so if I needed a validator for my critical production software, I'd probably go with `zod`.

    That said, I do think `arktype` has some fundamental advantages that mean in the long term, it's a better approach to invest in. My current focus in preparing for a stable release is adding docs, optimizing runtime perf, and publishing benchmarks (using similar techniques to https://github.com/sinclairzx81/typebox, so should land somewhere between 50-100x faster than non-optimized validators like Zod).

    Do you think that makes sense as a next priority? Do you think any of this makes sense at all, or have I just been coding in TS's type system long enough that my sanity has begun to erode? Agree or not with any of it, I'd love to hear your thoughts :-)

    - David

NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts