TypeScript in Go is already available!
Make NVIM even faster now. Go-to-definition used to cost me a coffee sip.
Cursor lands on a function.
I hit go-to-definition.
And then I wait.
One second. Two. On our biggest repo, sometimes five.
You don’t notice it in a small project.
In a monorepo with thousands of files, you feel every one of those seconds.
It turned into muscle memory: hit “find all references,” tab over to Slack, come back when it finished thinking.
That was normal for years. I figured it was just the price of a big codebase.
Then TypeScript 7.0 shipped.
They rewrote the entire compiler in Go. The old one was JavaScript checking your JavaScript, which is about as fast as it sounds.
The build numbers are almost rude:
VSCode’s typecheck dropped from 125 seconds to about 10.
Slack cut CI type-checking from 7.5 minutes to 1.25.
Opening a file full of errors in the editor went from 17 seconds to under 1.3.
Roughly 8 to 12 times faster across the board.
But I don’t stare at build logs all day. I live inside my editor.
So the number I actually cared about was that editor one.
I wired the native compiler into Neovim, restarted, and dropped my cursor on a symbol in our biggest project.
Go-to-definition.
It landed before my finger left the key.
No spinner, no Slack detour. References that used to take seconds now feel like they were already sitting there.
Here’s exactly what I did. Three steps, about ten minutes.
Step 1. Install the native compiler.
Global (a fallback for loose files with no project):
npm i -g typescript@latest # stable TS 7.0+, ships the `tsc` binaryPer project (recommended, so the LSP uses the repo’s version):
npm i -D typescript@latest # lands in node_modules/.bin/tscStep 2. Turn it on in Neovim. nvim-lspconfig already ships lsp/tsgo.lua, so you only override the cmd:
-- Stable TS 7.0 ships as `tsc` in the `typescript` package (LSP via `tsc --lsp`).
-- lspconfig’s lsp/tsgo.lua still launches `tsgo`, so override just the cmd.
vim.lsp.config(’tsgo’, {
cmd = function(dispatchers, config)
local bin = ‘tsc’
if (config or {}).root_dir then
local local_bin = vim.fs.joinpath(config.root_dir, ‘node_modules/.bin’, bin)
if vim.fn.executable(local_bin) == 1 then bin = local_bin end
end
return vim.lsp.rpc.start({ bin, ‘--lsp’, ‘--stdio’ }, dispatchers)
end,
})
vim.lsp.enable ‘tsgo’root_dir (it finds the root by lockfile, with monorepo and Deno support) and inlay hints already come from lsp/tsgo.lua. Your vim.lsp.config just deep-merges on top.
Step 3. Check it.
tsc --version # → Version 7.0.xIn nvim, on a .ts file: :LspInfo (or :checkhealth vim.lsp), and you’ll see the tsgo client attached.
A few notes:
You need Neovim 0.11+. That’s where
vim.lsp.configandvim.lsp.enablelive.It’s not in Mason. The binary comes from npm, not :Mason.
Want the nightly channel instead?
npm i -g @typescript/native-preview(that’s the tsgo binary) and usetsgoas your bin.
That’s the whole thing.
I went from waiting several seconds on our biggest projects, just to jump to a definition or list references, to everything being instant.
The editor finally keeps up with how fast I’m reading the code.
If you write TypeScript in Neovim, give it the ten minutes this week.
Then hold down go-to-definition on your ugliest file and enjoy how quiet it got.

