TypeScript Academy · Lezione

unknown vs any: la scelta più sicura

Apprenda perché unknown obbliga a verificare i tipi prima dell'uso.

Lezione 3 di 413 passaggi

unknown vs any: la scelta più sicura è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

Benvenuto

TypeScript 3.0 ha introdotto il tipo `unknown` come alternativa sicura rispetto a `any`. In questa lezione imparerà che cosa rende `unknown` più sicuro e quando utilizzarlo.

Il problema di any

Con `any`, TypeScript disattiva tutti i controlli. È possibile chiamare metodi, accedere alle proprietà e assegnare valori a variabili tipizzate senza limitazioni e senza sicurezza.
let val: any = getData();
val.someMethod(); // TypeScript: OK. Runtime: possible crash

Introduzione a unknown

`unknown` è il tipo top sicuro per i tipi. Come `any`, può contenere qualsiasi valore. A differenza di `any`, non può essere utilizzato prima di averne ristretto il tipo.
let val: unknown = getData();
// val.someMethod(); // Error: Object is of type 'unknown'

Restringere unknown prima dell'uso

Per utilizzare un valore `unknown`, deve restringerne il tipo con un controllo di tipo. TypeScript consentirà quindi le operazioni sul tipo ristretto.
let input: unknown = getInput();
if (typeof input === 'string') {
  console.log(input.toUpperCase()); // OK — narrowed to string
}

unknown non è assegnabile a tipi specifici

Non è possibile assegnare `unknown` a un tipo specifico senza un controllo o un'asserzione. Questo la obbliga a convalidare il valore prima di utilizzarlo.
let x: unknown = 'hello';
// let s: string = x; // Error
let s: string = x as string; // OK with assertion

Utilizzare unknown nei blocchi catch

In TypeScript 4.0 e versioni successive, gli errori catturati hanno `unknown` come tipo predefinito. È più sicuro rispetto al precedente tipo predefinito `any`, perché la obbliga a controllare il tipo dell'errore.
try {
  doSomething();
} catch (err: unknown) {
  if (err instanceof Error) {
    console.log(err.message); // safe
  }
}

unknown per i dati esterni

Quando analizza JSON o riceve dati da un'API, li tipizzi prima come `unknown` e li convalidi prima di utilizzarli.
const raw: unknown = JSON.parse(text);
if (
  typeof raw === 'object' &&
  raw !== null &&
  'name' in raw
) {
  console.log((raw as any).name);
}

Type guard con unknown

I type guard definiti dall'utente funzionano perfettamente con `unknown` e consentono di convalidare strutture complesse prima dell'uso.
function isUser(val: unknown): val is { name: string } {
  return typeof val === 'object' && val !== null && 'name' in val;
}

unknown rispetto a never

`unknown` è il tipo top: ogni tipo è assegnabile a esso. `never` è il tipo bottom: nessun tipo è assegnabile a esso. Sono opposti.
// unknown: anything can be assigned to it
let a: unknown = 42; // OK

// never: nothing can be assigned to it
function fail(): never { throw new Error(); }

Scegliere tra any e unknown

Utilizzi `unknown` quando riceve dati di tipo indeterminato, come JSON, input dell'utente o dati provenienti da API esterne. Utilizzi `any` solo come ultima risorsa durante una migrazione o con librerie prive di tipi.

Librerie di validazione a runtime

Librerie come Zod, Valibot e io-ts si abbinano perfettamente a `unknown`. Eseguono il parsing e la validazione, restituendo un valore correttamente tipizzato a partire da un input `unknown`.
import { z } from 'zod';
const UserSchema = z.object({ name: z.string(), age: z.number() });
const user = UserSchema.parse(unknownData); // throws if invalid

Verifica rapida

Che cosa deve fare prima di poter utilizzare un valore `unknown` in TypeScript?

Riepilogo

`unknown` è l'alternativa sicura a `any`. Accetta qualsiasi valore, ma la obbliga a restringerne il tipo prima dell'uso. Lo utilizzi per i dati esterni, nei blocchi catch e in ogni situazione in cui il tipo è realmente sconosciuto.
Gratis per iniziare

Impara TypeScript con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
101
Lezioni
352

Domande Frequenti

La lezione «unknown vs any: la scelta più sicura» è gratuita?

Sì — il testo completo di «unknown vs any: la scelta più sicura» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «unknown vs any: la scelta più sicura»?

Apprenda perché unknown obbliga a verificare i tipi prima dell'uso. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «unknown vs any: la scelta più sicura»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi primitivi: string, number, boolean
  2. Il tipo any e perché evitarlo
  3. unknown vs any: la scelta più sicura
  4. null, undefined e controlli strict null
← Torna a TypeScript Academy