<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7" -->

---
title: Seeing types where others don't | daily.dev
description: A developer documents their multi-year journey building a static type inference system for jq, the JSON processing tool. The post explains why jq's error...
canonical: https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Seeing types where others don't | daily.dev
og:description: A developer documents their multi-year journey building a static type inference system for jq, the JSON processing tool. The post explains why jq's error...
og:url: https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7
og:image: https://api.daily.dev/og/posts/7SRbYQoA7.png
og:image:alt: Seeing types where others don't
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Seeing types where others don't

**[Lobsters](https://daily.dev/sources/lobsters)** · 18 min read · 0 upvotes · 0 comments

## Summary

A developer documents their multi-year journey building a static type inference system for jq, the JSON processing tool. The post explains why jq's error messages are poor (no value provenance tracking), then walks through progressively more sophisticated approaches to inferring types from jq programs: starting with shape inference from field accesses, then adding type variables with constraint accumulation, and finally moving to a constraint-solver-based approach. Along the way, the author explores intersection types, overloaded operators, and the challenges of jq's stream semantics. The work-in-progress tool is called tjq and is available on GitHub. The broader takeaway is that even dynamically typed languages have implicit types, and we could leverage static inference to produce better error messages without requiring explicit annotations.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://theconsensus.dev/p/2026/03/06/seeing-types-where-others-dont.html>

## Similar posts on daily.dev

- [Type inference has usability problems \(2019\)](https://daily.dev/posts/type-inference-has-usability-problems-2019--gfzh59908) · Lobsters · 4 upvotes · 0 comments
- [Haskell for all: Record type inference for dummies](https://daily.dev/posts/haskell-for-all-record-type-inference-for-dummies-wub8q2glx) · Planet Haskell · 0 upvotes · 0 comments
- [Visual Types](https://daily.dev/posts/visual-types-yqneyg40x) · Lobsters · 5 upvotes · 0 comments

---

Tags: [#bash](https://daily.dev/tags/bash), [#general-programming](https://daily.dev/tags/general-programming), [#rust](https://daily.dev/tags/rust), [#type-systems](https://daily.dev/tags/type-systems)

[View this post on daily.dev](https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Seeing types where others don't","url":"https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7"},"datePublished":"2026-03-18T20:59:17.206Z","dateModified":"2026-10-15T02:17:51.943Z","description":"A developer documents their multi-year journey building a static type inference system for jq, the JSON processing tool. The post explains why jq's error...","image":"https://media.daily.dev/image/upload/s--ZrL_HSsR--/f_auto/v1722860399/public/Placeholder%2006","thumbnailUrl":"https://media.daily.dev/image/upload/s--ZrL_HSsR--/f_auto/v1722860399/public/Placeholder%2006","isAccessibleForFree":true,"articleSection":"Lobsters","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Lobsters","logo":"https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg","url":"https://daily.dev/sources/lobsters"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/seeing-types-where-others-don-t-7srbyqoa7","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"bash,general-programming,rust,type-systems","timeRequired":"PT18M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Lobsters","item":"https://daily.dev/sources/lobsters"},{"@type":"ListItem","position":3,"name":"Seeing types where others don't"}]}
```

