11///-- FUNCIONES ***********************************************************************************
22
33// Tipar una función en TypeScript no es más que especificar los tipos de los argumentos que recibe
4- // y el tipo de dato que devuelve. Es importante tener en cuenta que el número de argumentos que
5- // especifiquemos son obligatorios.
4+ // y el tipo del valor que devuelve. Es importante tener en cuenta que aquellos argumentos que
5+ // especifiquemos serán obligatorios, a menos que usemos un modificador de opcionalidad:
6+
7+ // Veamos un primer ejempo con funciones clásicas:
68function shout ( text : string , upperCase : boolean ) : string {
79 return ( upperCase ? text . toUpperCase ( ) : text ) + "!!!" ;
810}
911
10- const t1 = shout ( "hi" ) ; // [ts] Expected 2 arguments, but got 1
11- const t2 = shout ( "hi" , true ) ;
12- console . log ( t2 ) ; // "HI!!!"
12+ console . log ( shout ( "hi" ) ) ; // [ts] Expected 2 arguments, but got 1
13+ console . log ( shout ( "hi" , true ) ) ; // "HI!!!"
1314
14- // Su homólogo en arrow function
15+ // Su homólogo en arrow function:
1516const shout = ( text : string , upperCase : boolean ) : string =>
1617 ( upperCase ? text . toUpperCase ( ) : text ) + "!!!" ;
1718
18- const t3 = shout ( "hi" ) ; // [ts] Expected 2 arguments, but got 1
19- const t4 = shout ( "hi" , false ) ;
20- console . log ( t4 ) ; // "hi!!"
19+ console . log ( shout ( "hi" ) ) ; // [ts] Expected 2 arguments, but got 1
20+ console . log ( shout ( "hi" , true ) ) ; // "HI!!!"
21+
22+
23+ // *** Argumentos opcionales y argumentos por defecto *********************************************
24+
25+ // Utilizando el operador [?] sobre un argumento podremos declararlo como opcional a la hora de
26+ // invocar la función:
2127
22- // *** Argumentos Opcionales
23- // Utilizando el operador [?] sobre un argumento significa que dicho argumento es opcional
24- // a la hora de invocar a la función
2528const shout = ( text : string , upperCase ?: boolean ) : string =>
2629 ( upperCase ? text . toUpperCase ( ) : text ) + "!!!" ;
2730
28- // Si no pasamos explícitamente un argumento opcional su valor es, al igual que
29- // en JavaScript, undefined.
31+ // Si no pasamos explícitamente un argumento opcional su valor es, al igual que en otros casos
32+ // ya vistos en JavaScript, undefined:
3033console . log ( shout ( "hi" ) ) ; // "hi!!!" ---> upperCase = undefined.
3134
32- // *** Argumentos por defecto
33- // También es posible declarar el tipo de valores por defecto, aunque por lo general es más legible
34- // el no declarar el tipo y dejar que TypeScript lo infiera del propio valor por defecto.
35- // ⚠ Al añadir un valor por defecto, no se puede usar el operador opcional de forma explícita.
36- // Será TS quien automáticamente lo marque como opcional si está inicializado con un valor por
37- // defecto y no hay más argumentos obligatorios a continuación.
35+ // Suele ser muy habitual en caso de argumentos opcionales establecer su valor por defecto, como ya
36+ // vimos en JavaScript. Cuando esto sucede hay 2 cosas a tener en cuenta:
37+ // - Primero, suele ser más legible no declarar el tipo del argumento y dejar que lo infiera del
38+ // propio valor por defecto.
39+ // - Segundo, no podemos declararlo como opcional al mismo tiempo que ponemos valor por defecto.
40+ // Esto es así porque en cuanto usamos valores por defecto TS lo reconoce automáticamente como
41+ // opcional.
3842
39- // el tipo ya es opcional
4043const shout = ( text : string , upperCase : boolean = true ) : string =>
4144 ( upperCase ? text . toUpperCase ( ) : text ) + "!!!" ;
4245
4346console . log ( shout ( "hi" ) ) ; // "HI!!!"
4447
45- // *** Funciones como argumentos
46- // También es posible tipar argumentos que son funciones:
48+
49+ // *** Alias **************************************************************************************
50+
51+ // Hasta ahora, en los ejemplos vistos, el tipado de la funcion va integrado en la propia
52+ // declaración o definición de la función. Es decir, es un tipado en línea o inline. Sin embargo,
53+ // podemos extraer el tipo de una función aparte, y reusarlo cuando queramos.
54+ // A esto se le conoce como alias y para ello usamos el operador type:
55+
56+ type ShoutFunction = ( text : string , upperCase ?: boolean ) => string ;
57+ const shout : ShoutFunction = ( text , upperCase = true ) =>
58+ ( upperCase ? text . toUpperCase ( ) : text ) + "!!!" ;
59+
60+ console . log ( shout ( "hi" ) ) ;
61+
62+
63+ // *** Funciones como argumentos ******************************************************************
64+
65+ // En el caso de pasar funciones como argumentos de otras, podemos tipar en línea dichos argumentos
66+ // del siguiente modo:
67+
4768const shout = ( text : string , getNumExclamation : ( ) => number ) : string =>
4869 text . toUpperCase ( ) + "!" . repeat ( getNumExclamation ( ) ) ;
4970
@@ -56,21 +77,12 @@ console.log(shout("WoW", getRandom));
5677console . log ( shout ( "WoW" , getRandom ) ) ;
5778console . log ( shout ( "WoW" , getRandom ) ) ;
5879
59- // *** Alias
60- // En estos ejemplos vistos, el tipado de la funcion va integrado en la propia
61- // declaración/definición de la función. Sin embargo, podemos extraer el typo de una función
62- // aparte, y reusarlo cuando queramos. Para ello usamos el operador "type".
63- // Esto se conoce como ALIAS:
64- type ShoutFunction = ( text : string , getNumExclamation : ( ) => number ) => string ;
65- const shout : ShoutFunction = ( text , getNumExclamation ) =>
66- text . toUpperCase ( ) + "!" . repeat ( getNumExclamation ( ) ) ;
6780
68- console . log ( shout ( "TS rocks" , getRandom ) ) ;
81+ // *** Sobrecarga de funciones ********************************************************************
6982
70- // *** Sobrecarga de funciones
7183function switchType ( c : string ) : number ;
7284function switchType ( c : number ) : string ;
73- function switchType ( c ) {
85+ function switchType ( c : any ) {
7486 if ( typeof c === "string" ) {
7587 return Number ( c ) ;
7688 } else {
@@ -84,8 +96,11 @@ const r3 = switchType({}); // [ts] Argument of type '{}' is not assignable to pa
8496
8597// ⚠ Es posible sobrecargar funciones con diferente número de argumentos.
8698
87- // *** Tipando funciones en un interfaz, o lo que es lo mismo, usando interfaces para
88- // diseñar funciones.
99+
100+ // *** Tipando funciones con interfaces ***********************************************************
101+
102+ // O lo que es lo mismo, usando interfaces para diseñar funciones:
103+
89104interface RepeatString {
90105 ( text : string , n : number ) : string ;
91106}
@@ -94,9 +109,10 @@ const repeatString: RepeatString = (text, n) => Array(n).fill(text).join(" ");
94109
95110console . log ( repeatString ( "echo" , 3 ) ) ; // "echo echo echo"
96111
97- // ¿Para que es útil esto?
98- // Para añadirle propiedades a una función. Las funciones no dejan de ser objetos, de esta forma
99- // podríamos obligar a que una función tenga ciertas propiedades:
112+ // ¿Para que es realmente útil esto?
113+ // Para añadirle propiedades a una función. Ya dijimos que las funciones no dejan de ser objetos, y
114+ // por tanto podrían tener propiedades. De esta forma podríamos obligar a que una función tenga
115+ // ciertas propiedades tipadas de cierta forma:
100116
101117interface RepeatStringFunction {
102118 ( text : string , n : number ) : string ;
0 commit comments