Skip to main content

TypeScript Support

The Formidable Installer allowes you to scaffold your application with TypeScript. This means you can use TypeScript to write your controllers, resolvers, and more.

In this section, we will cover the basics and differences between a Formidable TypeScript Application and a Formidable Imba Application.


You may create a Formidable TypeScript project by passing the --language flag and setting the value to "typescript" in the Formidable Installer:

formidable new example-app --language typescript

@use Decorator

Formidable allows you to use the @use decorator to modify the behavior of any function within your application:

import { Controller } from './Controller'
import { @use } from '@formidablejs/framework'

export class UserController < Controller
def show user
await user || notFound 'User not found.'

The snippet above will query the database to look for a user under the users table with the first param using the id column.

If we wanted to do the same thing in a TypeScript application, we would have to import the use decorator from the @formidablejs/ts-ports package instead:

import { Controller } from './Controller';
import { use } from '@formidablejs/framework';

export class UserController extends Controller {
public async show(user: Promise<User | null>) : Promise<User | void> {
return (await user) || this.notFound('User not found');


Formidable views are a simple way to render HTML templates. By default, Formidable uses Imba as the default language of choice for building views, this means even if you're building your application in TypeScript, you will still use Imba for your Views.