Bun treats TypeScript as a first-class citizen.
Note — To add type declarations for Bun APIs like the Bun
global, follow the instructions at Intro > TypeScript. This page describes how the Bun runtime runs TypeScript code.
Running .ts
files
Bun can directly execute .ts
and .tsx
files just like vanilla JavaScript, with no extra configuration. If you import a .ts
or .tsx
file (or an npm
module that exports these files), Bun internally transpiles it into JavaScript then executes the file.
Note — Similar to other build tools, Bun does not typecheck the files. Use tsc
(the official TypeScript CLI) if you're looking to catch static type errors.
Is transpiling still necessary? — Because Bun can directly execute TypeScript, you may not need to transpile your TypeScript to run in production. Bun internally transpiles every file it executes (both .js
and .ts
), so the additional overhead of directly executing your .ts/.tsx
source files is negligible.
That said, if you are using Bun as a development tool but still targeting Node.js or browsers in production, you'll still need to transpile.
Path mapping
When resolving modules, Bun's runtime respects path mappings defined in compilerOptions.paths
in your tsconfig.json
. No other runtime does this.
Consider the following tsconfig.json
.
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"data": ["./data.ts"]
}
}
}
Bun will use baseUrl
to resolve module paths.
// resolves to ./src/components/Button.tsx
import { Button } from "components/Button.tsx";
Bun will also correctly resolve imports from "data"
.
import { foo } from "data";
console.log(foo); // => "Hello world!"
export const foo = "Hello world!"