TypeScript Cheat Sheet
Ultimo aggiornamento
Tipi base
I tipi primitivi e come annotare le variabili.
| Operazione | Sintassi |
|---|---|
| Stringa | let name: string = "Ada"; |
| Numero | let age: number = 25; |
| Booleano | let ok: boolean = true; |
| Array di T | let xs: number[] = [1, 2, 3]; |
| Array generico | let xs: Array<string> = []; |
| Tupla | let pair: [string, number] = ["a", 1]; |
| Any (disattiva la tipizzazione) | let x: any = 1; |
| Unknown (any più sicuro) | let x: unknown = JSON.parse(s); |
| Void (nessun ritorno) | function log(): void { … } |
| Never (non ritorna mai) | function fail(): never { throw … } |
| Null / undefined | let n: null = null; |
Inferenza e annotazioni di tipo
Quando lasciare che TS deduca il tipo e quando annotarlo.
| Operazione | Sintassi |
|---|---|
| Dedotto dal valore | let count = 0; // number |
| Annotazione esplicita | let count: number = 0; |
| Parametro di funzione | function add(a: number, b: number) { … } |
| Tipo di ritorno | function add(a: number, b: number): number { … } |
| Arrow function | const sq = (x: number): number => x * x; |
| Asserzione di tipo | const el = input as HTMLInputElement; |
| Const assertion (letterale) | const dirs = ["up", "down"] as const; |
| Asserzione non null | el!.focus(); |
Interfacce
Descrivono la forma di un oggetto.
| Operazione | Sintassi |
|---|---|
| Dichiarare | interface User { id: number; name: string; } |
| Proprietà opzionale | interface User { age?: number; } |
| Proprietà di sola lettura | interface User { readonly id: number; } |
| Firma di metodo | interface Logger { log(msg: string): void; } |
| Estendere un'altra interfaccia | interface Admin extends User { role: string; } |
| Firma di indice | interface Map { [key: string]: number; } |
| Implementare in una classe | class Db implements Logger { … } |
Alias di tipo e union
Dai un nome a un tipo e combina tipi con | e &.
| Operazione | Sintassi |
|---|---|
| Alias di tipo | type ID = string | number; |
| Alias di tipo oggetto | type User = { id: number; name: string }; |
| Tipo union | type Status = "idle" | "loading" | "done"; |
| Tipo intersezione | type Admin = User & { role: string }; |
| Tipo letterale | type Yes = "yes"; |
| Nullable | type Maybe<T> = T | null | undefined; |
| Alias di tipo funzione | type Handler = (e: Event) => void; |
Funzioni
Parametri tipizzati, valori di ritorno e overload.
| Operazione | Sintassi |
|---|---|
| Parametro opzionale | function greet(name?: string) { … } |
| Parametro predefinito | function greet(name = "friend") { … } |
| Parametri rest | function sum(...ns: number[]): number { … } |
| Tipo funzione | let fn: (a: number) => number; |
| Interfaccia richiamabile | interface Fn { (x: number): number; } |
| Firme di overload | function f(x: string): string; function f(x: number): number; function f(x: any) { return x; } |
| Ritorno void ignorato | const cb: () => void = () => 42; // ok |
Classi
Classi con modificatori di accesso e parameter properties.
| Operazione | Sintassi |
|---|---|
| Dichiarare una classe | class User { name: string; } |
| Costruttore | constructor(name: string) { this.name = name; } |
| Parameter property | constructor(public name: string) {} |
| Public / private / protected | private id: number; |
| Campo readonly | readonly id: number; |
| Membro statico | static count = 0; |
| Getter / setter | get name() { return this._name; } |
| Ereditarietà | class Admin extends User { … } |
| Classe astratta | abstract class Shape { abstract area(): number; } |
Generics
Tipi riutilizzabili parametrizzati da altri tipi.
| Operazione | Sintassi |
|---|---|
| Funzione generica | function id<T>(x: T): T { return x; } |
| Chiamata con tipo esplicito | id<string>("hi"); |
| Interfaccia generica | interface Box<T> { value: T; } |
| Alias di tipo generico | type Pair<A, B> = [A, B]; |
| Classe generica | class Stack<T> { items: T[] = []; } |
| Vincolo con extends | function len<T extends { length: number }>(x: T) { return x.length; } |
| Parametro di tipo predefinito | interface Box<T = string> { value: T; } |
| Operatore keyof | type K = keyof User; // "id" | "name" |
| Tipo di accesso per indice | type Name = User["name"]; |
Narrowing
Restringe una union a un solo tipo in fase di esecuzione.
| Operazione | Sintassi |
|---|---|
| Controllo con typeof | if (typeof x === "string") { … } |
| Controllo con instanceof | if (e instanceof Error) { … } |
| Operatore in | if ("name" in obj) { … } |
| Narrowing per uguaglianza | if (status === "done") { … } |
| Truthiness | if (value) { … } |
| Type guard personalizzato | function isUser(x: any): x is User { return "id" in x; } |
| Union discriminata | type Shape = { kind: "sq"; size: number } | { kind: "ci"; r: number }; |
| Esaustività con never | const _: never = shape; |
Enum
Insiemi di costanti con nome.
| Operazione | Sintassi |
|---|---|
| Enum numerico | enum Direction { Up, Down, Left, Right } |
| Enum di stringhe | enum Status { Idle = "IDLE", Done = "DONE" } |
| Usare un valore | let d: Direction = Direction.Up; |
| Const enum (inserito inline) | const enum Color { Red, Green, Blue } |
| Union di letterali (moderno) | type Status = "idle" | "done"; |
Utility types
Helper integrati che trasformano tipi esistenti.
| Operazione | Sintassi |
|---|---|
| Rendere opzionali tutte le proprietà | Partial<User> |
| Rendere obbligatorie tutte le proprietà | Required<User> |
| Rendere readonly tutte le proprietà | Readonly<User> |
| Scegliere un sottoinsieme di chiavi | Pick<User, "id" | "name"> |
| Omettere una o più chiavi | Omit<User, "password"> |
| Oggetto con chiavi specificate | Record<string, number> |
| Escludere da una union | Exclude<"a" | "b" | "c", "a"> |
| Estrarre da una union | Extract<"a" | "b", "a" | "c"> |
| Rimuovere null / undefined | NonNullable<string | null> |
| Tipo di ritorno di una funzione | ReturnType<typeof fn> |
| Tupla dei parametri di una funzione | Parameters<typeof fn> |
| Tipo risolto di una promise | Awaited<Promise<string>> |
Moduli
Importare ed esportare tra file.
| Operazione | Sintassi |
|---|---|
| Export con nome | export function add(a: number, b: number) { … } |
| Export predefinito | export default class User { … } |
| Riesportare | export { User } from "./user"; |
| Import con nome | import { add } from "./math"; |
| Import predefinito | import User from "./user"; |
| Importare solo un tipo | import type { User } from "./user"; |
| Importare tutto | import * as math from "./math"; |
| Riferimento a tripla barra | /// <reference types="node" /> |
Le basi di tsconfig
Le opzioni del compilatore che vale la pena conoscere.
| Opzione | Effetto |
|---|---|
"strict": true | Attiva tutti i controlli della modalità strict (consigliato). |
"target": "ES2022" | Versione di JavaScript generata da tsc. |
"module": "ESNext" | Sistema di moduli nell'output generato. |
"moduleResolution": "bundler" | Risolve i moduli come fanno i bundler moderni. |
"jsx": "react-jsx" | Abilita JSX per React 17+. |
"esModuleInterop": true | Import predefiniti più puliti dai moduli CommonJS. |
"skipLibCheck": true | Salta il controllo dei tipi in node_modules (build più veloci). |
"noEmit": true | Solo controllo dei tipi: lascia la generazione del codice al bundler. |
La sintassi TypeScript che usi più spesso, in una sola pagina. Questa TypeScript cheat sheet è un riferimento rapido per il TS di tutti i giorni: tipi base, interfacce, alias di tipo, generics, union, narrowing e gli utility types integrati. Dato che TypeScript si basa su JavaScript, tieni a portata di mano la JavaScript cheat sheet per la sintassi di base.
Tutto quello che trovi qui è TypeScript standard che compila con tsc e funziona ovunque giri JavaScript moderno. Copia ciò che ti serve o prova qualsiasi snippet dal vivo nel playground TypeScript, senza installare nulla. Sei alle prime armi con i tipi? Il corso TypeScript interattivo e gratuito di Coddy te li presenta partendo da JavaScript.
Domande frequenti sulla TypeScript cheat sheet
Questa TypeScript cheat sheet è gratuita?
Qual è la differenza tra un'interfaccia e un alias di tipo?
interface. Una regola comune: usa interface per le forme pubbliche degli oggetti e type per union, tuple e tipi calcolati.Qual è la differenza tra any e unknown?
any disattiva completamente il controllo dei tipi: il compilatore ti lascia fare qualsiasi cosa. unknown è sicuro: devi restringerlo (con typeof, instanceof o un type guard) prima di poterlo usare. Preferisci unknown per i valori provenienti da fonti esterne come JSON.parse o fetch: ti obbliga a validarli prima dell'uso.