TypeScript
Since the library is written in TypeScript and we put a lot of emphasis on the development experience, you can expect maximum TypeScript support. Types are automatically inferred from your Valibot schemas, providing type safety throughout your forms.
Type inference
Formisch uses Valibot's type inference to automatically derive TypeScript types from your schemas. You don't need to define separate types—they're inferred automatically.
import { Field, Form, useForm } from '@formisch/preact';
import * as v from 'valibot';
const LoginSchema = v.object({
email: v.pipe(v.string(), v.email()),
password: v.pipe(v.string(), v.minLength(8)),
});
export default function LoginPage() {
const loginForm = useForm({
schema: LoginSchema,
});
// TypeScript knows the form structure from the schema
// loginForm is of type FormStore<typeof LoginSchema>
return (
<Form
of={loginForm}
onSubmit={(output, event) => {
// output is fully typed based on LoginSchema
console.log(output.email); // ✓ Type-safe
console.log(output.username); // ✗ TypeScript error
}}
>
{/* Form fields */}
</Form>
);
}Input and output types
Valibot schemas can have different input and output types when using transformations. Formisch provides proper typing for both.
import { Field, Form, useForm } from '@formisch/preact';
import * as v from 'valibot';
const ProfileSchema = v.object({
age: v.pipe(
v.string(), // Input type: string (from HTML input)
v.transform((input) => Number(input)), // Output type: number
v.number()
),
birthDate: v.pipe(
v.string(), // Input type: string (ISO date string)