Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Serde Compatibility

typewriter automatically reads and respects serde attributes.

Field Renaming

#![allow(unused)]
fn main() {
#[serde(rename = "userId")]
pub id: String,
}

Field Skip

#![allow(unused)]
fn main() {
#[serde(skip)]
pub internal_field: String,
}

Tagged Enums

Internally Tagged (tag = "type")

#![allow(unused)]
fn main() {
#[derive(TypeWriter)]
#[serde(tag = "type")]
pub enum Event {
    Click { x: u32, y: u32 },
    KeyPress(char),
}
}

TypeScript:

type Event =
    | { type: "Click"; x: number; y: number }
    | { type: "KeyPress"; value: string };

Adjacently Tagged

#![allow(unused)]
fn main() {
#[derive(TypeWriter)]
#[serde(tag = "event", content = "data")]
pub enum Event {
    Click { x: u32, y: u32 },
}
}

TypeScript:

type Event =
    | { event: "Click"; data: { x: number; y: number } };

Untagged

#![allow(unused)]
fn main() {
#[derive(TypeWriter)]
#[serde(untagged)]
pub enum Event {
    Click { x: u32, y: u32 },
    String(String),
}
}

TypeScript:

type Event = { x: number; y: number } | string;

Field Flatten

#![allow(unused)]
fn main() {
#[serde(flatten)]
pub extra: ExtraData,
}

Rename All Variants

#![allow(unused)]
fn main() {
#[derive(TypeWriter)]
#[serde(rename_all = "snake_case")]
pub enum Status {
    InProgress,
    UserId,
}
}

Generates: IN_PROGRESS, USER_ID (in appropriate casing for each language).