@@ -368,7 +368,7 @@ const myTree: TreeNode<number> = {
368
368
369
369
// Aunque aplicando la recursividad en interfaces si que podíamos hacer cosas muy interesantes
370
370
// como esta:
371
- type IterableList < T > = T & { next : IterableList < T > | null } ;
371
+ type IterableList < T extends object > = T & { next : IterableList < T > | null } ;
372
372
373
373
interface Student {
374
374
name : string ;
@@ -422,14 +422,11 @@ const myTreeMM: TreeNodeMM<string> = ["hello", [["world"], "!"]];
422
422
// introduce nuevos tipos genéricos ineridos sobre la marcha: la keyword "infer".
423
423
424
424
// EJEMPLO MÁS SENCILLO SIN RECURSIVIDAD ***************
425
- type IsStringArray < T extends any [ ] > = T extends Array < infer Items >
426
- ? Items extends string
427
- ? true
428
- : false
429
- : never ;
425
+ type IsPrimitiveArray < T extends any [ ] > = T extends ( infer Type ) [ ] ? Type extends object ? false : true : never ;
430
426
431
- type Result1 = IsStringArray < [ 1 , 2 ] > ; // false
432
- type Result2 = IsStringArray < [ "hello" , "world" ] > ; // true
427
+ type Result1 = IsPrimitiveArray < [ 1 , 2 ] > ;
428
+ type Result2 = IsPrimitiveArray < [ "a" , "b" ] > ;
429
+ type Result3 = IsPrimitiveArray < [ { } ] > ;
433
430
434
431
// EJEMPLO CON RECURSIVIDAD ****************************
435
432
type RemoveZeroes < T extends any [ ] > = T extends [ infer Head , ...infer Tail ]
@@ -438,4 +435,13 @@ type RemoveZeroes<T extends any[]> = T extends [infer Head, ...infer Tail]
438
435
: [ Head , ...RemoveZeroes < Tail > ]
439
436
: T ;
440
437
441
- type Result3 = RemoveZeroes < [ 0 , 1 , true , 0 , 2 , 0 , "hello" , 0 , { } ] > ;
438
+ type Result4 = RemoveZeroes < [ 0 , 1 , true , 0 , 2 , 0 , "hello" , 0 , { } ] > ;
439
+
440
+ // Y una implementación básica, podría ser:
441
+
442
+ // Fijaos como he añadido el genérico T como const para que lo interprete como una tupla.
443
+ const removeZeroes = < const T extends any [ ] > ( array : T ) : RemoveZeroes < T > =>
444
+ array ?. filter ( x => x !== 0 ) as any ;
445
+
446
+ // Mira intellisense encima de 'result'
447
+ const result = removeZeroes ( [ 0 , 1 , true , "hello" , 0 , { name : "Santi" } , 0 ] ) ;
0 commit comments