TypeScript
Neutron is written in TypeScript and is designed to provide excellent type safety out of the box.
tsconfig.json
A scaffolded project ships a ready-to-use tsconfig.json. The options Neutron
relies on are Preact JSX and bundler module resolution:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["ES2022", "DOM"],
"jsx": "react-jsx",
"jsxImportSource": "preact",
"strict": true,
"skipLibCheck": true,
"types": ["vite/client"]
},
"include": ["src", "src/**/.neutron-*.d.ts"]
}
The include glob picks up Neutron's generated type files
(.neutron-routes.d.ts, .neutron-content.d.ts), which are written on
neutron-ts dev / neutron-ts build. Add path aliases under
compilerOptions.paths if you want them — e.g. "~/*": ["src/*"].
Type Inference
Neutron's "magic" comes from its ability to infer types across the network boundary.
// The return type of this function...
export async function loader() {
return { hello: "world" };
}
// ...is inferred here!
const data = useLoaderData<typeof loader>();
// data is { hello: string }
This works for useLoaderData, useActionData, and generally means you rarely need to write manual interfaces for your API responses.