Guest User

Untitled

a guest
Jan 21st, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.84 KB | None | 0 0
  1. /**********************************************************
  2. * COSAS SIMPLES CON TIPOS PARA IR ABRIENDO BOCA.
  3. *********************************************************/
  4.  
  5. /* Una interfaz que maneja datos en una agenda de contactos. */
  6. interface Person {
  7. /* Datos personales sobre esta persona. */
  8. name: string;
  9. age: number;
  10. city: string;
  11.  
  12. /* Datos de la empresa para la que trabaja. */
  13. position: string;
  14. company: string;
  15. mail: string;
  16. };
  17.  
  18. /* Una instancia de un objeto persona. */
  19. const alex: Person = {
  20. name: 'Alex',
  21. age: 28,
  22. city: 'Madrid',
  23.  
  24. position: 'Developer',
  25. company: 'Contosso',
  26. mail: 'alex@contosso.com',
  27. };
  28.  
  29. /* Comprobamos que se corresponde. */
  30. function printPerson(p: Person) {
  31. console.log(`${p.name} tiene ${p.age} años y vive en ${p.city}`);
  32. console.log(`Trabaja como ${p.position} en ${p.company} y su mail es ${p.mail}`);
  33. }
  34. printPerson(alex);
  35.  
  36.  
  37. /***********************************************************
  38. * TIPO AVANZADO DE TYPESCRIPT PICK
  39. **********************************************************/
  40.  
  41. /* Pick te retorna un subconjunto de una interfaz con las claves que le digas. */
  42. type WorkInfo = Pick<Person, 'position' | 'company' | 'mail'>;
  43.  
  44. function printWorkInfo(p: WorkInfo) {
  45. /* Fijate que si descomentas la siguiente línea da error, porque p es un objeto
  46. que solo tiene "position", "company" y "mail" como propiedades válidas. */
  47. // console.log(`${p.name} tiene ${p.age} años y vive en ${p.city}`);
  48. console.log(`Trabaja como ${p.position} en ${p.company} y su mail es ${p.mail}`);
  49. }
  50. printWorkInfo(alex);
  51.  
  52.  
  53. /************************************************************
  54. * TIPO AVANZADO DE TYPESCRIPT KEYOF
  55. ************************************************************/
  56.  
  57. /* Dado un tipo T, keyof(T) expande a un tipo discriminante cuyo valor puede ser cualquiera
  58. de las claves presentes en T. Por supuesto, para esto T tiene que ser un tipo con keys.
  59. En el siguiente ejemplo, PersonKey es de tipo "name" | "age" ... */
  60. type PersonKey = keyof Person;
  61.  
  62. /* Por ejemplo: */
  63. const nameKey: PersonKey = "name";
  64.  
  65. /* En cambio si descomentas lo siguiente te dará error. */
  66. // const unexistentKey: PersonKey = "hello";
  67.  
  68. /* Descomenta la siguiente línea y trata de autocompletar tras el =, verás los valores que acepta. */
  69. // const fooKey: PersonKey =
  70.  
  71.  
  72. /*************************************************************
  73. * TIPO AVANZADO DE TYPESCRIPT EXCLUDE
  74. *************************************************************/
  75.  
  76. /* Exclude<U, V> devuelve un tipo discriminado que a su vez es diferencia de tipos. Es decir,
  77. Exclude<U, V> puede adoptar cualquiera de los tipos que hay en el tipo discriminado U,
  78. excepto aquellos tipos que también estén en V. */
  79. type Vocal = 'a' | 'e' | 'i' | 'o' | 'u';
  80. type PrimeraLetra = 'a' | 'b' | 'c' | 'd' | 'e';
  81.  
  82. /* Debería quedar claro a estas alturas: */
  83. const vocal: Vocal = 'a';
  84. const primeraLetra: PrimeraLetra = 'c';
  85.  
  86. /* PrimeraLetraNoVocal será la diferencia de ('a' 'b' 'c' 'd' 'e' - 'a' 'e' 'i' 'o' 'u').
  87. Así que puede adoptar los valores 'b' 'c' 'd'. No puede aceptar 'a' ni 'e'. */
  88. type PrimeraLetraNoVocal = Exclude<PrimeraLetra, Vocal>;
  89.  
  90. const aceptable: PrimeraLetraNoVocal = 'b';
  91. // const inaceptable: PrimeraLetraNoVocal = 'e';
  92.  
  93.  
  94. /*******************************************************************
  95. * COMBINAMOS KEYOF Y EXCLUDE
  96. *******************************************************************/
  97.  
  98. /* Si combinamos keyof con Exclude, podríamos obtener las keys de una interfaz T
  99. excepto aquellas que estén en una lista negra de keys que no queramos devolver. */
  100. type PersonalKeys = Exclude<keyof Person, "company" | "position" | "mail">;
  101.  
  102. /* Fijate que ahora PersonalKeys puede ser 'name', 'age' o 'city'. De momento strings: */
  103. const personalProp: PersonalKeys = "age";
  104. // const unacceptablePersonalProp: PersonalKeys = "company";
  105.  
  106. /* Si ahora lo juntamos con el Pick que hicimos arriba... */
  107. type PersonalKeys2 = Exclude<keyof Person, keyof WorkInfo>;
  108.  
  109. /* En teoría debería ser equivalente. */
  110. const personalProp2: PersonalKeys2 = "age";
  111.  
  112. /* Y ya si lo metemos en un Pick, ¡podemos obtener un subobjeto de otro! */
  113. type PersonalPersonData = Pick<Person, Exclude<keyof Person, keyof WorkInfo>>;
  114.  
  115. function printPersonalData(p: PersonalPersonData) {
  116. console.log(`${p.name} tiene ${p.age} años y vive en ${p.city}`);
  117. // console.log(`Trabaja como ${p.position} en ${p.company} y su mail es ${p.mail}`);
  118. }
  119. printPersonalData(alex);
  120.  
  121. /* Generalizando podemos hacer un tipo Blacklist. */
  122. type Difference<A, B> = Pick<A, Exclude<keyof A, keyof B>>;
  123.  
  124. function printPersonalDataUsingDiff(p: Difference<Person, WorkInfo>) {
  125. console.log(`${p.name} tiene ${p.age} años y vive en ${p.city}`);
  126. // console.log(`Trabaja como ${p.position} en ${p.company} y su mail es ${p.mail}`);
  127. }
  128.  
  129. printPersonalDataUsingDiff(alex);
  130.  
  131.  
  132. /* Hasta aquí mi charla Ted, gracias por venir. */
Add Comment
Please, Sign In to add comment