Prefacio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

En la primavera de 2016, visité a mi antiguo compañero de trabajo Evan Martin en la oficina de Google en San Francisco y le pregunté qué le entusiasmaba. Le había hecho esta misma pregunta muchas veces a lo largo de los años porque las respuestas eran muy variadas e impredecibles, pero siempre interesantes: Herramientas de creación de C++, controladores de audio de Linux, crucigramas en línea, complementos de Emacs. Esta vez, Evan estaba entusiasmado con TypeScript y Visual Studio Code.

¡Me sorprendió! Ya había oído hablar de TypeScript, pero sólo sabía que había sido creado por Microsoft y creía erróneamente que tenía algo que ver con .NET. Como usuario de Linux de toda la vida, no podía creer que Evan se hubiera subido al equipo de Microsoft.

Entonces Evan me enseñó vscode y la zona de juegos de TypeScript y me convertí al instante. Todo era muy rápido, y la inteligencia del código facilitaba la construcción de un modelo mental del sistema de tipos. Después de años escribiendo anotaciones de tipo en comentarios JSDoc para el compilador Closure, esto parecía un JavaScript tipado que funcionaba de verdad. ¿Y Microsoft había creado un editor de texto multiplataforma sobre Chromium? Quizá fuera un lenguaje y una cadena de herramientas que mereciera la pena aprender.

Hacía poco que me había unido a Sidewalk Labs y estaba escribiendo nuestro primer JavaScript. El código base era aún lo suficientemente pequeño como para que Evan y yo pudiéramos convertirlo todo a TypeScript en los días siguientes.

Desde entonces estoy enganchado. TypeScript es más que un sistema de tipos. También aporta todo un conjunto de servicios del lenguaje que son rápidos y fáciles de usar. El efecto acumulativo es que TypeScript no sólo hace que el desarrollo de JavaScript sea más seguro: ¡también lo hace más divertido!

A quién va dirigido este libro

Los libros de Effective pretenden ser el "segundo libro estándar" sobre su tema. Sacarás el máximo partido de TypeScript Eficaz si tienes alguna experiencia práctica previa trabajando con JavaScript y TypeScript. Mi objetivo con este libro no es enseñarte TypeScript o JavaScript, sino ayudarte a pasar de usuario principiante o intermedio a experto. Los artículos de este libro lo hacen ayudándote a construir modelos mentales de cómo funcionan TypeScript y su ecosistema, haciéndote consciente de los escollos y trampas que debes evitar, y guiándote hacia el uso de las muchas capacidades de TypeScript de la forma más eficaz posible. Mientras que un libro de referencia te explicará las cinco formas en que un lenguaje te permite hacer X, un libro Eficaz te dirá cuáles de esas cinco usar y por qué.

TypeScript ha evolucionado rápidamente en los últimos años, pero mi esperanza es que se haya estabilizado lo suficiente como para que el contenido de este libro siga siendo válido en los próximos años. Este libro se centra principalmente en el lenguaje en sí, más que en cualquier framework o herramienta de construcción. No encontrarás ejemplos de cómo utilizar React o Angular con TypeScript, ni de cómo configurar TypeScript para que funcione con webpack, Babel o Rollup. Los consejos de este libro deberían ser relevantes para todos los usuarios de TypeScript.

Por qué escribí este libro

Cuando empecé a trabajar en Google, me dieron un ejemplar de la tercera edición de C++ Eficaz. No se parecía a ningún otro libro de programación que hubiera leído. No pretendía ser accesible a los principiantes ni una guía completa del lenguaje. En lugar de explicarte lo que hacían las distintas funciones de C++, te explicaba cómo debías y cómo no debías utilizarlas. Lo hacía mediante docenas de artículos breves y específicos, motivados por ejemplos concretos.

El efecto de leer todos estos ejemplos mientras utilizaba el lenguaje a diario fue inconfundible. Ya había utilizado C++ antes, pero por primera vez me sentía cómodo con él y sabía cómo pensar en las opciones que me presentaba. En años posteriores tendría experiencias similares leyendo Java Eficaz y JavaScript Eficaz.

Si ya te sientes cómodo trabajando en algunos lenguajes de programación diferentes, sumergirte directamente en los extraños rincones de uno nuevo puede ser una forma eficaz de desafiar tus modelos mentales y aprender lo que lo hace diferente. He aprendido muchísimo sobre TypeScript escribiendo este libro. Espero que tengas la misma experiencia leyéndolo.

Cómo está organizado este libro

Este libro es una colección de "artículos", cada uno de los cuales es un breve ensayo técnico que te da consejos específicos sobre algún aspecto de TypeScript. Los artículos están agrupados temáticamente en capítulos, pero siéntete libre de saltar de uno a otro y leer los que te parezcan más interesantes.

El título de cada artículo transmite la idea clave. Estas son las cosas que debes recordar cuando utilices TypeScript, por lo que vale la pena hojear el índice para que te vengan a la cabeza. Si estás escribiendo documentación, por ejemplo, y tienes la molesta sensación de que no deberías escribir información sobre tipos, entonces sabrás que debes leer el punto 30: No repitas información sobre tipos en la documentación.

El texto del artículo motiva los consejos del título y los respalda con ejemplos concretos y argumentos técnicos. Casi todos los puntos tratados en este libro se demuestran mediante código de ejemplo. Suelo leer libros técnicos mirando los ejemplos y hojeando la prosa, y supongo que tú haces algo parecido. Espero que leas la prosa y las explicaciones. Pero los puntos principales deberían seguir apareciendo si hojeas los ejemplos.

Después de leer el artículo, deberías entender por qué te ayudará a utilizar TypeScript de forma más eficaz. También sabrás lo suficiente para entender si no se aplica a tu situación. Scott Meyers, el autor de C++ Eficaz, da un ejemplo memorable de esto. Conoció a un equipo de ingenieros que escribían software que funcionaba con misiles. Sabían que podían ignorar sus consejos sobre cómo evitar las fugas de recursos, porque sus programas siempre terminarían cuando el misil alcanzara el objetivo y su hardware explotara. No conozco ningún misil con tiempos de ejecución de JavaScript, pero el telescopio espacial James Webb tiene uno, ¡así que nunca se sabe!

Por último, cada punto termina con "Cosas para recordar". Se trata de unas cuantas viñetas que resumen el tema. Si estás hojeando el artículo, puedes leerlos para hacerte una idea de lo que dice y saber si quieres seguir leyendo. Aun así, ¡deberías leer el artículo! Pero el resumen te servirá en caso de apuro.

Convenciones en ejemplos de código TypeScript

Todos los ejemplos de código de son TypeScript, excepto cuando queda claro por el contexto que son JSON, GraphQL o algún otro lenguaje. Gran parte de la experiencia de usar TypeScript implica interactuar con tu editor, lo que presenta algunos retos en la impresión. He adoptado algunas convenciones para que esto funcione.

La mayoría de los editores muestran los errores subrayándolos con garabatos. Para ver el mensaje de error completo, pasa el ratón por encima del texto subrayado. Para indicar un error en una muestra de código, pongo garabatos en una línea de comentario debajo del lugar donde se produce el error:

let str = 'not a number';
let num: number = str;
 // ~~~ Type 'string' is not assignable to type 'number'

De vez en cuando edito los mensajes de error para que sean más claros y breves, pero nunca elimino un error. Si copias/pegas un ejemplo de código en tu editor, deberías obtener exactamente los errores indicados, ni más ni menos.

Para llamar la atención sobre la ausencia de error, utilizo // OK:

let str = 'not a number';
let num: number = str as any;  // OK

Deberías poder pasar el ratón por encima de un símbolo en tu editor para ver lo que TypeScript considera su tipo. Para indicarlo en texto, yo utilizo un comentario que empieza por "tipo es":

let v = {str: 'hello', num: 42};  // Type is { str: string; num: number; }

El tipo es para el primer símbolo de la línea (v en este caso) o para el resultado de una llamada a una función:

'four score'.split(' ');  // Type is string[]

Esto coincide con el tipo que verías en tu editor carácter por carácter. En el caso de las llamadas a funciones, puede que necesites asignarlas a una variable temporal para ver el tipo.

De vez en cuando introduciré sentencias no-op para indicar el tipo de una variable en una línea concreta de código:

function foo(x: string|string[]) {
  if (Array.isArray(x)) {
    x;  // Type is string[]
  } else {
    x;  // Type is string
  }
}

Las líneas x; sólo están ahí para demostrar el tipo en cada rama del condicional. No necesitas (ni debes) incluir declaraciones como ésta en tu propio código.

A menos que se indique lo contrario o quede claro por el contexto, las muestras de código están pensadas para ser verificadas con la bandera --strict. Todas las muestras se verificaron utilizando TypeScript 4.4 beta.

Convenciones tipográficas utilizadas en este libro

En este libro se utilizan las siguientes convenciones tipográficas:

Cursiva

Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.

Constant width

Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.

Constant width bold

Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.

Constant width italic

Muestra el texto que debe sustituirse por valores proporcionados por el usuario o por valores determinados por el contexto.

Este elemento significa un consejo o sugerencia.

Este elemento significa una nota general.

Este elemento indica una advertencia o precaución.

Utilizar ejemplos de código

El material complementario (ejemplos de código, ejercicios, etc.) se puede descargar en https://github.com/danvk/effective-typescript.

Si tienes una pregunta técnica o un problema al utilizar los ejemplos de código, envía un correo electrónico a

Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requierepermiso.

Agradecemos la atribución, pero en general no la exigimos. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo: "TypeScript Eficaz por Dan Vanderkam (O'Reilly). Copyright 2020 Dan Vanderkam, 978-1-492-05374-3".

Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en

Aprendizaje en línea O'Reilly

Durante más de 40 años, O'Reilly Media ha proporcionado formación tecnológica y empresarial, conocimientos y perspectivas para ayudar a las empresas a alcanzar el éxito.

Nuestra red única de expertos e innovadores comparten sus conocimientos y experiencia a través de libros, artículos y nuestra plataforma de aprendizaje online. La plataforma de aprendizaje en línea de O'Reilly te ofrece acceso bajo demanda a cursos de formación en directo, rutas de aprendizaje en profundidad, entornos de codificación interactivos y una amplia colección de textos y vídeos de O'Reilly y de más de 200 editoriales. Para más información, visita http://oreilly.com.

Cómo contactar con nosotros

Dirige tus comentarios y preguntas sobre este libro a la editorial:

  • O'Reilly Media, Inc.
  • 1005 Gravenstein Highway Norte
  • Sebastopol, CA 95472
  • 800-998-9938 (en Estados Unidos o Canadá)
  • 707-829-0515 (internacional o local)
  • 707-829-0104 (fax)

Puedes acceder a la página web de este libro, donde se recogen erratas, ejemplos y cualquier información adicional, en https://oreil.ly/Effective_TypeScript.

Envía un correo electrónico para comentar o hacer preguntas técnicas sobre este libro.

Para noticias e información sobre nuestros libros y cursos, visita http://www.oreilly.com.

Encuéntranos en Facebook: http://facebook.com/oreilly

Síguenos en Twitter: http://twitter.com/oreillymedia

Míranos en YouTube: http://youtube.com/oreillymedia

Agradecimientos

Hay muchas personas que han ayudado a hacer posible este libro. Gracias a Evan Martin por presentarme TypeScript y mostrarme cómo pensar en ello. A Douwe Osinga por ponerme en contacto con O'Reilly y apoyarme en el proyecto. A Brett Slatkin por sus consejos sobre la estructura y por mostrarme que alguien a quien conocía podía escribir un libro eficaz. A Scott Meyers por idear este formato y por su entrada en el blog "Libros Eficaces ", que me proporcionó una orientación esencial.

A mis revisores, Rick Battagline, Ryan Cavanaugh, Boris Cherny, Yakov Fain, Jesse Hallett y Jason Killian. A todos mis compañeros de trabajo en Sidewalk que aprendieron TypeScript conmigo a lo largo de los años. A todos los de O'Reilly que ayudaron a hacer realidad este libro: Angela Rufino, Jennifer Pollock, Deborah Baker, Nick Adams y Jasmine Kwityn. Al equipo de TypeScript NYC, Jason, Orta y Kirill, y a todos los ponentes. Muchos artículos se inspiraron en charlas del Meetup, como se describe en la siguiente lista:

  • El punto 3 se inspiró en una entrada del blog de Evan Martin que me pareció especialmente esclarecedora cuando estaba aprendiendo TypeScript por primera vez.

  • El punto 7 se inspiró en la charla de Anders sobre tipado estructural y relaciones keyof en la TSConf 2018, y en una charla de Jesse Hallett en el TypeScript NYC Meetup de abril de 2019.

  • Tanto la guía de Basarat como las útiles respuestas de DeeV y GPicazo en Stack Overflow fueron esenciales para escribir el punto 9.

  • El punto 10 se basa en un consejo similar del punto 4 de JavaScript eficaz (Addison-Wesley).

  • Me inspiré para escribir el punto 11 por la confusión masiva en torno a este tema en el TypeScript NYC Meetup de agosto de 2019.

  • El punto 13 recibió una gran ayuda de varias preguntas sobre type frente a interface en Stack Overflow. Jesse Hallett sugirió la formulación en torno a la extensibilidad.

  • Jacob Baskin proporcionó ánimos y los primeros comentarios sobre el punto 14.

  • El punto 19 se inspiró en varias muestras de código enviadas alsubreddit r/typescript.

  • El punto 26 se basa en mis propios escritos en Medium y en una charla que di en el TypeScript NYC Meetup de octubre de 2018.

  • El punto 28 se basa en un consejo habitual en Haskell ("haz que los estados ilegales sean irrepresentables"). La historia del Air France 447 está inspirada en el increíble artículo de 2011 de Jeff Wise en Popular Mechanics.

  • El punto 29 se basa en un problema que me encontré con las declaraciones de tipo de Mapbox. Jason Killian sugirió la redacción del título.

  • El consejo sobre la nomenclatura del punto 36 es habitual, pero esta formulación concreta se inspiró en el breve artículo de Dan North en 97 Things Every Programmer Should Know (O'Reilly).

  • El punto 37 se inspiró en la charla de Jason Killian en el primer TypeScript NYC Meetup de septiembre de 2017.

  • El punto 41 se basa en las notas de la versión TypeScript 2.1. El término "evolving any" no se utiliza mucho fuera del propio compilador de TypeScript, pero me parece útil tener un nombre para este patrón inusual.

  • El punto 42 se inspiró en una entrada del blog de Jesse Hallett. El punto 43 fue muy útil gracias a los comentarios de Titian Cernicova Dragomir en el número 33128 de TypeScript.

  • El punto 44 se basa en el trabajo de York Yao sobre la herramienta type-coverage. Quería algo así, ¡y existía!

  • El punto 46 se basa en una charla que di en el TypeScript NYC Meetup de diciembre de 2017.

  • El punto 50 tiene una deuda de gratitud con la entrada de David Sheldrick en el blog Artsy sobre los tipos condicionales, que me desmitificó enormemente el tema.

  • El punto 51 se inspiró en una charla que Steve Faulkner, alias southpolesteve, dio en el Meetup de febrero de 2019.

  • El punto 52 se basa en mis propios escritos en Medium y en mi trabajo sobre la herramienta de comprobación de tipografías, que finalmente se integró en dtslint.

  • El punto 53 fue inspirado/reforzado por el post de Kat Busch en Medium sobre los distintos tipos de enums en TypeScript, así como por los escritos de Boris Cherny sobre este tema en Programming TypeScript (O'Reilly).

  • El punto 54 fue inspirado por mi propia confusión y la de mis compañeros de trabajo sobre este tema. La explicación definitiva la da Anders en TypeScript PR #12253.

  • La documentación MDN fue esencial para redactar el Tema 55.

  • El punto 56 se basa libremente en el punto 35 de Effective JavaScript (Addison-Wesley).

  • El capítulo 8 se basa en mi propia experiencia migrando la vetusta biblioteca dygraphs.

Encontré muchas de las entradas de blog y charlas que condujeron a este libro a través del excelente subreddit r/typescript. Estoy especialmente agradecido a los desarrolladores que proporcionaron allí ejemplos de código que fueron esenciales para comprender problemas comunes en TypeScript para principiantes. Gracias a Marius Schulz por el boletín TypeScript Weekly. Aunque sólo es ocasionalmente semanal, siempre es una excelente fuente de material y una gran manera de mantenerse al día con TypeScript. A Anders, Daniel, Ryan y a todo el equipo de TypeScript en Microsoft por las charlas y todos los comentarios sobre los problemas. La mayoría de mis problemas eran malentendidos, ¡pero no hay nada tan satisfactorio como enviar un error y ver inmediatamente que el propio Anders Hejlsberg lo soluciona! Por último, gracias a Alex por apoyarme tanto durante este proyecto y por ser tan comprensivo con todas las vacaciones, mañanas, noches y fines de semana de trabajo que necesité para completarlo.

Get TypeScript eficaz now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.