Skip to content

Commit 0025603

Browse files
committed
include advanced operators in TS
1 parent 377d804 commit 0025603

1 file changed

Lines changed: 61 additions & 1 deletion

File tree

02-languages/02-apuntes/02-typescript/106 advanced types.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,4 +460,64 @@ const removeZeroes = <const T extends any[]>(array: T): RemoveZeroes<T> =>
460460
array?.filter(x => x !== 0) as any;
461461

462462
// Mira intellisense encima de 'result'
463-
const result = removeZeroes([0, 1, true, "hello", 0, {name: "Santi"}, 0]);
463+
const result = removeZeroes([0, 1, true, "hello", 0, {name: "Santi"}, 0]);
464+
465+
466+
// *** OPERADORES AVANZADOS *****************************************************************
467+
468+
/**
469+
* 1. Const inference
470+
* La palabra clave `const` puede usarse en TS para indicar al sistema de inferencia de tipos
471+
* que sea lo más específico posible, de manera que extraiga todos los valores literales exactos
472+
* como tipos, en lugar de usar tipos convencionales como string, number, boolean, etc.
473+
*
474+
* Esto es útil cuando queremos hacer ciertos valores inmutables y poder extarer su tipado de manera
475+
* literal, haciendo que su tipo sea exactamente los valores que tiene asignados.
476+
*/
477+
478+
const DEBUG_CONFIG = { // Chequea el tipo inferido con y sin 'as const'
479+
env: 'development',
480+
debug: true,
481+
} as const;
482+
483+
const ROLES = ["admin", "user", "viewer"] as const; // Chequea el tipo inferido con y sin 'as const'
484+
485+
/**
486+
* 2. Const type parameters
487+
*
488+
* De igual modo, podemos utilizar la palabra clave const delante de parámetros de tipo (genéricos)
489+
* para indicar a TS que, una vez se pase algún valor como argumento de dicho parámetro, se extraiga
490+
* su tipo forma literal.
491+
*
492+
* Esto permite que los genéricos conserven los valores literales exactos. Suele ser muy útil para
493+
* trabajar con tuplas e interfaces literales.
494+
*/
495+
496+
// Sin const
497+
const createTuple = <T extends any[]>(...items: T) => items;
498+
const result = createTuple(1, "hello", true); // Tipo inferido => [number, string, boolean]
499+
500+
// Con const
501+
const createTuple = <const T extends any[]>(...items: T) => items;
502+
const result = createTuple(1, "hello", true); // Tipo inferido => [1, "hello", true]
503+
504+
/**
505+
* 3. Satisfies
506+
*
507+
* El operador 'satisfies' verifica que un valor cumple exactamente con un tipo o interfaz, sin
508+
* cambiar el tipo inferido del valor.
509+
*
510+
* Es útil para asegurar que un objeto literal respeta una estructura, pero mantiene sus tipos
511+
* literales. En otras palabras, ayuda a validar estructuras sin perder la precisión de los tipos
512+
* literales.
513+
*/
514+
515+
interface Admin {
516+
id: number;
517+
name: string;
518+
}
519+
520+
const ADMINS = [
521+
{ id: 1, name: "Santi" },
522+
{ id: 2, name: "Javi" },
523+
] as const satisfies Admin[];

0 commit comments

Comments
 (0)