@@ -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