En aquest tema, explorarem conceptes avançats de manipulació de tipus en TypeScript. Aquests conceptes són essencials per a la creació de biblioteques robustes i per a la gestió de tipus complexos en projectes grans. Aprendrem sobre tipus condicionals, tipus mapats avançats, i altres tècniques que ens permetran escriure codi més flexible i segur.
Continguts
- Tipus Condicionals Avançats
- Tipus Mapats Avançats
- Tipus Recursius
- Tipus d'Extracció i Exclusió
- Exercicis Pràctics
- Tipus Condicionals Avançats
Els tipus condicionals ens permeten definir tipus basats en una condició. Aquests tipus són molt útils per a la creació de tipus dinàmics i flexibles.
Sintaxi Bàsica
Exemple Pràctic
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
Tipus Condicionals Niuats
Podem niuar tipus condicionals per crear lògiques més complexes.
type TypeName<T> = T extends string ? "string" : T extends number ? "number" : T extends boolean ? "boolean" : T extends undefined ? "undefined" : T extends Function ? "function" : "object"; type T1 = TypeName<string>; // "string" type T2 = TypeName<() => void>; // "function" type T3 = TypeName<{}>; // "object"
- Tipus Mapats Avançats
Els tipus mapats ens permeten crear nous tipus basats en la transformació d'altres tipus.
Exemple Bàsic
type Readonly<T> = { readonly [P in keyof T]: T[P]; }; interface User { id: number; name: string; } type ReadonlyUser = Readonly<User>; // ReadonlyUser és { readonly id: number; readonly name: string; }
Tipus Mapats amb Condicions
Podem combinar tipus mapats amb tipus condicionals per crear transformacions més sofisticades.
type Nullable<T> = { [P in keyof T]: T[P] | null; }; type PartialNullable<T> = { [P in keyof T]?: T[P] | null; }; interface User { id: number; name: string; } type NullableUser = Nullable<User>; // NullableUser és { id: number | null; name: string | null; } type PartialNullableUser = PartialNullable<User>; // PartialNullableUser és { id?: number | null; name?: string | null; }
- Tipus Recursius
Els tipus recursius ens permeten definir tipus que es refereixen a ells mateixos. Són útils per a la definició de tipus de dades com arbres o llistes enllaçades.
Exemple Pràctic
type JSONValue = | string | number | boolean | null | JSONObject | JSONArray; interface JSONObject { [key: string]: JSONValue; } interface JSONArray extends Array<JSONValue> {} const example: JSONValue = { name: "John", age: 30, friends: ["Jane", "Doe"], address: { city: "New York", zip: "10001" } };
- Tipus d'Extracció i Exclusió
TypeScript proporciona utilitats per extreure o excloure tipus específics d'un conjunt de tipus.
Extract
i Exclude
type T1 = Extract<"a" | "b" | "c", "a" | "f">; // "a" type T2 = Exclude<"a" | "b" | "c", "a" | "f">; // "b" | "c"
NonNullable
El tipus NonNullable
elimina null
i undefined
d'un tipus.
- Exercicis Pràctics
Exercici 1: Tipus Condicionals
Defineix un tipus condicional que verifiqui si un tipus és una funció.
type IsFunction<T> = T extends (...args: any[]) => any ? true : false; type Test1 = IsFunction<() => void>; // true type Test2 = IsFunction<number>; // false
Exercici 2: Tipus Mapats
Crea un tipus mapat que faci que totes les propietats d'un tipus siguin opcionals i nullables.
type OptionalNullable<T> = { [P in keyof T]?: T[P] | null; }; interface Product { id: number; name: string; price: number; } type OptionalNullableProduct = OptionalNullable<Product>; // OptionalNullableProduct és { id?: number | null; name?: string | null; price?: number | null; }
Exercici 3: Tipus Recursius
Defineix un tipus recursiu per a una estructura d'arbre binari.
interface TreeNode<T> { value: T; left?: TreeNode<T>; right?: TreeNode<T>; } const tree: TreeNode<number> = { value: 1, left: { value: 2, left: { value: 4 }, right: { value: 5 } }, right: { value: 3, left: { value: 6 }, right: { value: 7 } } };
Conclusió
En aquesta secció, hem explorat tècniques avançades de manipulació de tipus en TypeScript, incloent tipus condicionals, tipus mapats avançats, tipus recursius i utilitats d'extracció i exclusió. Aquests conceptes són fonamentals per a la creació de codi TypeScript robust i flexible. Practica aquests conceptes amb els exercicis proporcionats per consolidar el teu coneixement i prepara't per als temes més avançats que vindran.
Curs de TypeScript
Mòdul 1: Introducció a TypeScript
- Què és TypeScript?
- Configuració de l'entorn de TypeScript
- Tipus bàsics
- Anotacions de tipus
- Compilació de TypeScript
Mòdul 2: Treballant amb Tipus
Mòdul 3: Tipus Avançats
Mòdul 4: Funcions i Mòduls
- Tipus de Funció
- Paràmetres Opcional i per Defecte
- Paràmetres Rest
- Mòduls i Espais de Noms
- Decoradors
Mòdul 5: Programació Asíncrona
Mòdul 6: Eines i Millors Pràctiques
- Linting i Formatació
- Proves de Codi TypeScript
- TypeScript amb Webpack
- TypeScript amb React
- Millors Pràctiques