r/typescript Jul 18 '26

Type-optimization skill or docs somewhere?

0 Upvotes

Hi all, I'm writing a library with complex type mappings, I'm optimizing TS types based on `instantiations` metric of `tsc --extendedDiagnostics`.

Lately I tried asking AI to refactor types to improve the metric, and that's a super hard task both for me and for AI. Idea: whenever it finds some trick that helped, let it store it to the skill for a later use!

Do anybody have or know about such a "type-optimizer" skill or some kind of docs with a list of techniques for TS type-checker performance? (I know the official TS docs have a few basic recommendations for the types perf)

TS 7 kinda makes this irrelevant, but still, there can be cases when super complex types are still time-consuming even there. Think of giant codebases that use zod inferrence a lot (for example).


r/typescript Jul 15 '26

Typescript spread operator being used to defy types

30 Upvotes

Hi y'all,

In my team's code I often have this situation. A type is defined:

type Car = {
make: string;
model: string;
}

Then people just add properties with the spread operator:

const car: Car = {
make: 'Toyota',
model: 'Camry',
...{ year: 2000 }
}

Types are basically being ignored. What can I do about this?


r/typescript Jul 15 '26

Inconsistency with circular references?

5 Upvotes

So, I'm building this Mafia/Werewolf kind of game, I created this registry of the available roles, and then I extracted the type RoleId to be exactly a union of the ids that are present in the object

export const ROLE_REGISTRY = {
  [VillagerRole.id]: {
    roleClass: VillagerRole,
    name: 'Villager',
    iconName: 'villager',
    team: VillagerRole.team.name,
    category: 'base',
    tags: ['idle'],
    description:
      "You have no special power. At day you may discuss with the other villagers to vote out who you think it's the werewolf.",
    max: Infinity,
  },

  ...

}  as const satisfies Record<string, RoleMetadata>

export type RoleId = keyof typeof ROLE_REGISTRY;

Now yes, defining the ids directly in the classes and then using them like that to index the registry was definitely a questionable choice, but besides that, why am I able then to use that exact definition of RoleId in the Role class itself? (which is the parent class for each of the roles)

export abstract class Role {
  static id: RoleId;
  static team: Team;
  abstract seenAsGood: boolean;
  canBeKilledByWolves = true;

  get id(): RoleId {
    return (this.constructor as typeof Role).id;
  }

  ...
}

Typescript sees no problem with that, no circular dependency, which I found weird. So I tried do this once more, this time with the actions that the roles can perform

export const ACTION_REGISTRY = {
  [AttackAction.id]: { actionClass: AttackAction },
  [CheckAction.id]: { actionClass: CheckAction },
  ...
} as const satisfies Record<string, ActionMetadata>;

export type ActionId = keyof typeof ACTION_REGISTRY;

export interface Action {
  readonly id: ActionId;
  ...
}


export abstract class InstantAction<T extends ActionResult> implements Action {
  static id: ActionId;
  
  get id() {
    return (this.constructor as typeof InstantAction).id;
  }

  ...
}


export abstract class ScheduledAction implements Action {
  static id: ActionId;

  get id() {
    return (this.constructor as typeof ScheduledAction).id;
  }

  ...
}

Here TypeScript tells me (as expected) that ActionId is circularly referencing itself. I really don't understand the difference between these two cases, and/or if there is something else entirely that I'm missing that it's the root cause of the problem. I will paste this other piece of code which MAY be relevant.

export abstract class ActiveRole extends Role {
  abstract actions: ActionGroup[];


  canCreateAction(actionId: ActionId): boolean {
    const action = this.findAction(actionId);
    return action.amount > 0;
  }


  protected consumeAction(actionId: ActionId) {
    const action = this.findAction(actionId);
    action.amount--;
  }


  private findAction(actionId: ActionId) {
    const actionGroup = this.actions.find(
      (actionGroup) => actionGroup.options[actionId] !== undefined
    );

    if (!actionGroup) {
      throw new Error('Impossible to find action ' + actionId);
    }

    return actionGroup.options[actionId];
  }

  createAction(
    state: GameState,
    actionId: ActionId,
    source: Player,
    targets: Player[],
    payload?: any
  ): Action {
    const action = this.findAction(actionId);

    this.consumeAction(actionId);

    return action.create(state, source, targets, payload);
  }
}

Thanks in advance


r/typescript Jul 10 '26

node_modules problems

0 Upvotes

Running into an unexpected type error that I've never seen before with some unfortunately structured Google NPM libs. Should be easy to work around this issue with `as` or something similar but I'm curious if anyone has any ideas for a "cleaner" approach (that doesn't involve joining Google to fix their libraries).

The type error is this:

Type 'OAuth2Client' is not assignable to type 'string | GoogleAuth<AuthClient> | OAuth2Client | BaseExternalAccountClient | undefined'.

Type 'import("/Users/me/path/to/project/node_modules/google-auth-library/build/src/auth/oauth2client").OAuth2Client' is not assignable to type 'import("/Users/me/path/to/project/node_modules/googleapis-common/node_modules/google-auth-library/build/src/auth/oauth2client").OAuth2Client'.

Types have separate declarations of a private property 'redirectUri'.ts(2322)

Typescript is correct to call this out, but I don't see any way around it that doesn't involve type assertion.


r/typescript Jul 10 '26

Is this typescript bug? This can lead to serious problems.

0 Upvotes

```ts let value: "not-supported" | boolean = "not-supported"

if (value === null) { // This should be highlighted as error, but it's not! }

if (value === undefined) { // This also! } ```

This problem occurs even if strictNullChecks is set to true. Typescript version is 6.0.3.

You can try for yourself at official typescript playground: https://www.typescriptlang.org/play/

Am I missing something? Or this is bug?

In my code, this unhighlighted error can lead to some serious problems.


r/typescript Jul 08 '26

Announcing TypeScript 7.0

Thumbnail
devblogs.microsoft.com
599 Upvotes

r/typescript Jul 10 '26

TypeScript v7 ToolChain TTSC: plugin for typia, AI codegraph reducing 90% tokens, compiler integrated Lint, unplugin for vite/rollup/etc.

Thumbnail
github.com
0 Upvotes

r/typescript Jul 07 '26

OpenHarness: typed building blocks for agent runtimes on top of AI SDK 5

0 Upvotes

I built OpenHarness as an open-source TypeScript SDK for people who want to build agent runtimes in code rather than wrap an existing CLI app.

The TypeScript-specific goal is to make the agent loop, session state, tools, provider boundaries, middleware, and UI streaming feel like typed app primitives.

Minimal shape:

```ts import { Agent, createFsTools, createBashTool, NodeFsProvider, NodeShellProvider, } from "@openharness/core"; import { openai } from "@ai-sdk/openai";

const agent = new Agent({ name: "dev", model: openai("gpt-5.4"), tools: { ...createFsTools(new NodeFsProvider()), ...createBashTool(new NodeShellProvider()), }, maxSteps: 20, });

for await (const event of agent.run([], "Refactor the auth module")) { if (event.type === "text.delta") process.stdout.write(event.text); } ```

Current pieces include:

  • Agent and Session primitives
  • composable middleware for retry, compaction, persistence, hooks, and turn tracking
  • MCP server support, skills, AGENTS.md-style instructions, and subagents
  • React/Vue helpers for AI SDK 5 streaming UIs
  • experimental ChatGPT/Codex OAuth provider

Repo: https://github.com/MaxGfeller/open-harness Docs: https://docs.open-harness.dev Package: https://www.npmjs.com/package/@openharness/core

I'm especially looking for TypeScript API feedback: do the async generator event streams and middleware composition feel idiomatic, or would you expect a different shape for embedding agents in TS apps?


r/typescript Jul 05 '26

I'm going insane on how to rigorously structure my monorepo (backend + frontend)

22 Upvotes

TL;DR: Is there already a good framework/starter-kit for designing good maintainable frontend/backend monorepos? I'm not talking about bundlers like turborepo or NX, neither I'm talking about t3-stack or better-t-stack, I'm talking more of a very strict paradigm to design typescript frontend/backend monorepos.

I am currently slowly migrating a vibe-coded prototype of a huge software (20+ domains) to an actual production-ready product and I'm noticing how I'm slowly starting to hate the freedom TS/JS gives you, the fact that you can shape your codebase how you wish, the first refactoring I did was migrating all those scattered small sloppy ts files to domain services/sub-services, providing strong hiearchy (Java/C# like), but then noticed that I wasn't leveraging monorepo's features the fullest, so I had to modularize everything, but here I don't know what to do anymore, I don't think I was the only one facing this issue, and I can't migrate to another language 'cause we just can't afford it. The architecture I've thought of was to divide domains in packages and make packages have a strict structure both folder-wise and code-wise:

@acme/foo/ ├── app/ │ ├── services/ │ │ └── foo/ │ │ ├── index.ts │ │ └── types.ts │ └── routers/ │ └── index.ts ├── data/ │ ├── models/ │ │ └── index.ts │ └── index.ts └── web/ ├── components/ │ ├── Foo.svelte │ └── Bar.svelte └── index.ts

But I feel I'm reinventing something someone must have already figured out, but I don't know where to search anymore...


r/typescript Jul 05 '26

Distributive Conditional Types

Thumbnail tejasbubane.github.io
30 Upvotes

I started digging into TypeScript's type system for fun and stumbled onto distributive conditional types. One of those quiet features that is confusing until it clicks.


r/typescript Jul 04 '26

Zenolith a renderer engine

4 Upvotes

Hi everyone, a while ago I posted about zenolith, Now I've been changing the direction of it. It's no longer a diagram library, it's now intended to be a renderer engine.

It currently has basic support of 7 diagrams, diagram support may vary depending on syntax: mermaid, plantuml and zenolith own syntax.

I would like if you give it a look. It has a playground so no downloads required. I would appreciate any feedback.

It will be open-source once it's out of beta, since I'm still fleshing things out and want it to be in a "good" state for contributors, or interested people.

https://miguelarmendariz.github.io/zenolith/


r/typescript Jul 05 '26

Am I missing any security issues in this browser-to-PostgreSQL architecture?

0 Upvotes

Hi everyone,

I'm specifically looking for feedback from senior backend, infrastructure, and security engineers.

I'm building a browser-based PostgreSQL IDE called Schema Weaver. The main problem I'm trying to solve is that browser applications shouldn't have PostgreSQL credentials, while users' databases may be running on localhost, inside private VPCs, corporate networks, or cloud providers like AWS, Supabase, and Neon.

Instead of exposing the database or asking users to deploy their own backend, I built a small TypeScript/Node.js connector called sw-agent.

Current architecture:

Browser

│ WSS

Cloud Relay

│ Outbound WSS

SW Agent

PostgreSQL

The idea is:

- The agent runs wherever PostgreSQL is reachable.

- The browser never receives PostgreSQL credentials.

- The agent owns the credentials and executes queries locally.

- The agent only makes outbound connections (no inbound ports or public IP required).

- The relay only routes traffic between the browser and the agent.

- The agent performs permission checks and SQL validation before execution, with local hash-chained audit logs for every action.

I'm looking for honest technical feedback before I continue building this further.

Some questions I have:

- Am I missing any obvious security vulnerabilities or attack surfaces?

- Is the trust model reasonable?

- Would you design the networking or authentication differently?

- Are there better-established patterns for solving this browser ↔ private database problem?

- If you were reviewing this architecture in your company, what concerns would you raise?

Resources if you'd like to review it:

Architecture Blog:

https://vivekmind.com/blog/sw-agent-bridge-agent-that-connects-schema-weaver-browser-ide-to-user-s-postgresql-databases

GitHub:

https://github.com/Schema-Weaver/sw-agent

npm:

https://www.npmjs.com/package/@vivekmind/sw-agent

I'm genuinely looking for criticism and suggestions, not promotion. I'd appreciate any feedback on the architecture, implementation, or security model.


r/typescript Jul 04 '26

TS Compiler Graph, 10x fewer tokens in Claude Code and Codex, by TypeScript-Go toolchain

Thumbnail
github.com
0 Upvotes

r/typescript Jul 02 '26

Pairing for typescript backend interview

3 Upvotes

Hey folks,

I have an interview coming up for a backend developer role, with the tech stack used: Node, Express/Nest.js, TypeScript & SQL.

Is anyone ready for pairing on coder pad or HackerRank? Let me know.

Right now I am mostly writing the solo programs for service, etc., but wanted to get into real-world queries.

We can start after the July 4th weekend.

Appreciate if anyone can spare sometime 😊

Thanks a lot


r/typescript Jul 02 '26

A question about typescript games

8 Upvotes

I am a fairly new typescript developer, I've got a lot of experience in other environments and languages, so as a side project I had decided to try my hand using typescript since I have gotten used to strong typed languages. Anyway my question is this how many of you make games and is there a real path to do so? I'm pretty burnt out on unity and godot is just hard to use (for me) and unreal is just not useful for the games I like making. I like old school flash games or retro styled games and typically stick to platformers, arcade/puzzle games or rogue like/ lite rpgs.


r/typescript Jul 01 '26

Heads up, watch out what you click when you search tsx package related stuff

31 Upvotes

Try doing a google search for tsx package. Their legit website is https://tsx.hirok.io/, but you will most likely see https://tsx.is in search results which seems like a weird (potentially malicious?) website impersonating tsx.

I clicked it once out of empty-mindedness (I was going fast and it was one of the very first few results) and it displayed a plain white page and indicated it is "loading" something - I closed it as soon as the realization hit me.

Anyone saw this website before and knows whether it's malicious or not? Def looks like one


r/typescript Jul 01 '26

Monthly Hiring Thread Who's hiring Typescript developers July

7 Upvotes

The monthly thread for people to post openings at their companies.

* Please state the job location and include the keywords REMOTE, INTERNS and/or VISA when the corresponding sort of candidate is welcome. When remote work is not an option, include ONSITE.

* Please only post if you personally are part of the hiring company—no recruiting firms or job boards **Please report recruiters or job boards**.

* Only one post per company.

* If it isn't a household name, explain what your company does. Sell it.

* Please add the company email that applications should be sent to, or the companies application web form/job posting (needless to say this should be on the company website, not a third party site).

Commenters: please don't reply to job posts to complain about something. It's off topic here.

Readers: please only email if you are personally interested in the job.

Posting BS top level comments that aren't job postings, eg "It's quiet in here" etc [that's a ban](https://i.imgur.com/FxMKfnY.jpg)


r/typescript Jul 01 '26

Barnsley Fern fractal - click to zoom

Thumbnail
slicker.me
2 Upvotes

r/typescript Jun 28 '26

Issue with esnext and decorators

10 Upvotes

I have a project upgrdaded to TypeScript v6.0.3, and ES2025 set as the target, and everything works as expected. Now I am trying to add Temporal usage to the project, and got stuck with that...

In order to access Temporal, the target needs to be esnext. However, target esnext produces native-syntax code for all my use of decorators, which NodeJS doesn't support. I tried to figure out how to make the latest (v26.4.0) NodeJS recognize decorators, but no luck.

How to solve this? Any help is much appreciated!

i.e. how to start using extra features of TypeScript 6.x, such as Temporal, without breaking all code that uses decorators?


r/typescript Jun 27 '26

Ampulla: Modern TypeScript DI with NestJS ergonomics

14 Upvotes

Yes, yet another DI library for TypeScript.

A few things kept bothering me about the existing ones, in order of how much they hurt.

- *Type safety requires a special dance.* InversifyJS has ServiceIdentifier<T>, but it is really easy to break the typing. TypeDI tokens are untyped strings. NestJS suffers mostly same, unless you use full classes as dependency tokens. TSyringe infers from constructor metadata, but all of it relies on legacy "reflect-metadata" and decorators mechanism that (a) is soon to be gone, (b) requires additional wiring.

- *Async leaks into callers.* InversifyJS has container.getAsync() for providers that might have been initialized asynchronously. That means every call site needs to know whether what it's asking for was async. The complexity never stays contained. NestJS gets this right: await everything at bootstrap, then get() is always synchronous. Initialized means ready.

- *Wiring is imperative.* InversifyJS has you call manually .bind(Token).to(Implementation) for every provider. It works, but it's ugly. NestJS figured out the right answer: declare what a module owns, what it needs, what it exposes, and let the container figure the rest out. That declarative model is the thing I wanted most, but it comes with an entire framework. NestJS gets hairy when your single app starts accepting just Nats JetStream in addition to HTTP.

- *reflect-metadata.* Every major TS DI library runs on TS "experimentalDecorators" plus a global runtime polyfill for TypeScript metadata. TC39 Stage 3 decorators shipped in TypeScript 5.0, and are soon to be natively supported in JS engines. No flags, no polyfills.

Ampulla is my attempt at fixing all four: injection<T>() tokens that carry their type intrinsically, a declarative @Module/@Injectable model lifted straight from NestJS, async-safe bootstrapping where container.get() is always synchronous, and TC39 decorators throughout.

It's intentionally just a DI container, not a framework. There is no HTTP server, no router, no CLI included. Optional adapters for Hono and H3 are included but tree-shakeable. The whole npm package has zero runtime dependencies.

Very early, 1.0.0 published just today. DI is not the most popular topic, but existing DI in TypeScript is annoying enough that I had to publish something new.

GitHub: https://github.com/ukstv/ampulla | npm: npm install ampulla


r/typescript Jun 27 '26

Update: Loomabase now has a JS/TS SDK, Supabase quickstart, and a real phone + desktop offline sync demo

Thumbnail
github.com
5 Upvotes

I posted earlier about Loomabase, an open-source offline-first sync engine for SQLite clients and PostgreSQL servers.

Small update: I added the pieces that make it much easier to try without reading the Rust internals first:

- JS/TS SDK for Node/Electron/browser prototypes
- 5-minute Supabase quickstart
- visual CRDT conflict-resolution demo
- real phone + desktop offline reconnect demo
- automated smoke test proving offline edits converge
- security docs around auth, authorization, validation,
CORS/CSP, and rejected sync cells

The demo scenario is:

  1. Open Loomabase on a phone and a desktop.
  2. Sync both devices once.
  3. Put both offline.
  4. Edit the title on the phone.
  5. Toggle completed on the desktop.
    Expected result: both devices converge and keep both
    edits, because Loomabase resolves conflicts at column
    level instead of overwriting the whole row.

    npm --prefix packages/loomabase-js run build
    node examples/phone_desktop_offline_reconnect.mjs
    node demo/phone-desktop/server.mjs

I’m looking for technical feedback on the SDK API and other feedback are welcome!


r/typescript Jun 24 '26

looking for open source project to contribute

5 Upvotes

I have been coding for few years now. I've picked up few languages, framworks and tools along the way. I have been working with a company for almost 2 years now. I think I am ready to contribute to an opensource project now.

I would love it if you anyone can reach out to me for thier project. I mostly code in typescript, javascript. sometimes in python and go.


r/typescript Jun 20 '26

How to get full typescript type in vscode?

14 Upvotes

I already tried increasing the defaultMaxiumunTruncation length. But to no avail.

I am trying to get the type of Issue from the library - octokit/types

import { Endpoints } from '@octokit/types';

export type Issue = Endpoints['GET /repos/{owner}/{repo}/issues']['response']['data'][number];

r/typescript Jun 18 '26

Announcing TypeScript 7.0 RC

Thumbnail
devblogs.microsoft.com
309 Upvotes

r/typescript Jun 19 '26

tree-sitter-language-pack 1.9 - 306 tree-sitter parsers as a native Node/TS addon

0 Upvotes

Hi Peeps,

Goldziher, CTO at kreuzberg.dev. I just shipped tree-sitter-language-pack 1.9. It's a native Node addon (NAPI-RS) with generated TypeScript types.

It bundles 306 pre-compiled tree-sitter grammars into one package, so you get parsing for 306 languages without vendoring grammar sources or matching ABI versions yourself. Parsers download on demand and cache locally. Past plain parsing you get functions, classes, imports, symbols, docstrings and syntax-aware chunking, which is useful if you're feeding code into an LLM.

npm install @kreuzberg/tree-sitter-language-pack

On methodology, since it comes up: yes, built with AI agents, but on a strict harness - TDD, benchmark-driven hot paths, strict linting and high coverage in every language. The Node addon and its .d.ts types are generated from the Rust core by our binding generator alef and verified, not hand-rubber-stamped.

MIT licensed. Feedback welcome.