Skip to content

Commit 2a4b0e8

Browse files
committed
update ts notes for functions
1 parent 1ff6b69 commit 2a4b0e8

1 file changed

Lines changed: 55 additions & 39 deletions

File tree

02-languages/02-apuntes/02-typescript/103 functions.ts

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,70 @@
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:
68
function 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:
1516
const 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
2528
const 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:
3033
console.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
4043
const shout = (text: string, upperCase: boolean = true): string =>
4144
(upperCase ? text.toUpperCase() : text) + "!!!";
4245

4346
console.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+
4768
const shout = (text: string, getNumExclamation: () => number): string =>
4869
text.toUpperCase() + "!".repeat(getNumExclamation());
4970

@@ -56,21 +77,12 @@ console.log(shout("WoW", getRandom));
5677
console.log(shout("WoW", getRandom));
5778
console.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
7183
function switchType(c: string): number;
7284
function 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+
89104
interface RepeatString {
90105
(text: string, n: number): string;
91106
}
@@ -94,9 +109,10 @@ const repeatString: RepeatString = (text, n) => Array(n).fill(text).join(" ");
94109

95110
console.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

101117
interface RepeatStringFunction {
102118
(text: string, n: number): string;

0 commit comments

Comments
 (0)