Type Safety
Neutron leverages TypeScript's inference capabilities to provide complete type safety across the network boundary, without needing code generation steps or separate DTO files.
Loaders
When you use useLoaderData<typeof loader>(), the type of the data is inferred directly from the return type of your loader function.
// 1. Define return type automatically
export async function loader() {
return {
user: {
name: "Alice",
age: 30,
roles: ["admin", "editor"] // inferred as string[]
}
};
}
export default function Page() {
// 2. Data is typed!
const data = useLoaderData<typeof loader>();
// TypeScript knows data.user.name is a string
// TypeScript knows data.user.age is a number
// TypeScript knows data.user.roles is string[]
return <div>{data.user.name}</div>;
}
Date Objects
Note that because data is serialized over the network (JSON), rich objects like Date will be converted to strings.
export async function loader() {
return { createdAt: new Date() };
}
export default function Page() {
const { createdAt } = useLoaderData<typeof loader>();
// createdAt is a string (ISO format), not a Date object!
}
If you need Date objects, standard practice is to construct them in the component: new Date(createdAt).