4. EcmaScript
Nuestro código es
escalable y evoluciona de
forma automática
Tipado
Adición de tipos
estáticos a Javascript
Clases
Similar a ES6 pero con
azúcar sintáctico de serie
que nos dará más poder
Interfaces
Código que nos ayudará
a modelar nuestras APIs
Genéricos
Nos permite utilizar
clases con distintos tipos
Intellisense
Información de los
objetos y librerías que
utilizamos
5. Resumiendo…
Más fácil de mantener Tipado estático opcionalMenos testeo
“Hagas lo que hagas con Typescript, al final será
Javascript compilado entendible por tu navegador”
7. ● Mediante el uso de Vue CLI
$ npm install -g @vue/cli
$ vue create name-project
Proyecto nuevo
Inicia Vue CLI
https://cli.vuejs.org/
8. Elige un preset
Proyecto nuevo
Inicia Vue CLI
https://cli.vuejs.org/
? Please pick a preset:
default (babel, eslint)
> Manually select features
9. ? Check the features needed for your project:
( * ) Babel
( * ) Typescript
( ) Progressive Web App (PWA) Support
( ) Router
( ) Vuex
( ) CSS Pre-processor
( * ) Linter / Formatter
( ) Unit Testing
( ) E2E Testing
Escoge las características
Elige un preset
Proyecto nuevo
Inicia Vue CLI
https://cli.vuejs.org/
10. Escoge las características
Elige un preset
Proyecto nuevo
Inicia Vue CLI
? Use class-style component syntax? Yes
? Use Babel alongisde Typescript for auto-detected
polyfills? Yes
? Pick a linter / formatter config: TSLint
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel,
PostCSS, ESLint, etc.? In dedicated files
? Save this as a preset for future projects? No
Resto de configuración
https://cli.vuejs.org/
11. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
12. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
Esta acción realiza cambios en los
siguientes archivos:
- Punto de entrada a la aplicación
13. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
Esta acción realiza cambios en los
siguientes archivos:
- Punto de entrada a la aplicación
- Agrega un tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
· · ·
14. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
Esta acción realiza cambios en los
siguientes archivos:
- Punto de entrada a la aplicación
- Agrega un tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
· · ·
"noImplicitThis": true,
"noImplicitAny": true,
15. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
Esta acción realiza cambios en los
siguientes archivos:
- Punto de entrada a la aplicación
- Agrega un tsconfig.json
- Declaración de módulos para .vue
declare module '*.vue' {
import Vue from 'vue';
export default Vue;
}
16. Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
Esta acción realiza cambios en los
siguientes archivos:
- Punto de entrada a la aplicación
- Agrega un tsconfig.json
- Declaración de módulos para .vue
- Cambios en App.vue, archivos js, …
25. Vue.extend
Ventajas:
● Es la forma estándar de Vue
● Código más organizado
● Compatible con Vetur (autocompletado en los template)
Contras:
● Declaración de $refs
● Props con tipos complejos
26. +
Vue.extend
● Cuerpo del componente
● Props
● Propiedades del data
● Propiedades computadas
● Ciclos de vida
● Métodos
export default Vue.extend({
props: {
msg: String,
},
data() {
return {
users: [] as MemberEntity[],
};
},
computed: {
counter(): number {
return this.users.length;
},
},
mounted() {
console.log('Extend mounted’);
},
methods: {
selectUser(id: number): void {
console.log(id);
},
},
})
29. Decorators
Ventajas:
● Te permite definir tus componentes utilizando una API basada en clases
● Soporte oficial mediante el paquete vue-class-component
● Es preferible utilizar vue-property-decorator (Component, Prop, Mixins, …)
30. Desventajas:
● No es compatible con Vetur
● Libertad total a la hora de declarar tu componente (más difícil de mantener)
● Poca documentación
● Poco apoyo por parte de los IDE, linters, prettier…
● Los bundles generados son más pesados
Decorators
31. +
Decorators
● Cuerpo del componente
● Props
● Propiedades del data
● Propiedades computadas
● Ciclos de vida
● Métodos
<script lang="ts">
import { Component, Vue, Prop } from 'vue-
property-decorator';
@Component
export default class Decorators extends Vue {
@Prop() msg!: string;
users: MemberEntity[] = [];
get counter(): number {
return this.users.length;
}
mounted() {
console.log('Decorators mounted');
}
selectUser(id: number): void {
console.log(id);
}
}
</script>
34. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true (al menos al principio y
poco a poco, ir añadiendo resto de flags de strict)
35. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
import Vue from 'vue';
declare module 'vue/types/vue' {
interface Vue {
$_console: Function;
}
}
Vue.prototype.$_console = () =>
console.log('%c Soy un simple plugin ', styles);
36. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
● Indicar qué tipo retorna las computed properties
37. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
● Indicar qué tipo retorna las computed properties
● Props con tipos complejos o declaradas como Array (Vue.extend)
props: {
numbers: Array as () => {},
complexObject: Object as () => ComplexObjectInterface,
},
38. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
● Indicar qué tipo retorna las computed properties
● Props con tipos complejos o declaradas como Array (Vue.extend)
● Declaración de $refs o métodos dentro de data (Vue.extend)
export default (Vue as VueConstructor<Vue & {
$refs: {
counter: HTMLElement;
refExtend: InstanceType<typeof RefComponent>,
};
}>).extend({
· · ·
39. +
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
● Indicar qué tipo retorna las computed properties
● Props con tipos complejos o declaradas como Array (Vue.extend)
● Declaración de $refs o métodos dentro de data (Vue.extend)
● Data no undefined (Decorators)
baz = undefined; // NO será reactivo
bar = null; // Será reactivo
CTRL+1 ZOOM:
CTRL+2 Dibujar:
una elipse: Tabulador (dibujar sin soltar)
un rectángulo: CTRL (sin soltar). También funciona con AltGr.
una recta: Tecla de mayúsculas (sin soltar).
una flecha: CTRL+mayúsculas (sin soltar).
Buenas tardes, mi nombre es Lissette, soy de Tenerife y trabajo como desarrolladora web para Ultebra Solutions.
Estos son los perfiles donde se me pueden localizar, twitter, github, etcétera…
Primero que nada, quiero agradecer a la organización del evento que me hayan dado la oportunidad de poder estar hoy aquí para hablar de Vue, y gracias a ustedes obviamente por haber venido a mi charla.
Pues nada, empezamos. Mi charla es una introducción sobre cómo integrar Typescript con Vue y explicar, de manera muy básica, dos de las formas que te proporciona Vue para crear tus componentes haciendo uso de Typescript.
Typescript es un superset de Javascript, lo que significa que es una capa que envuelve a Javascript la cual te permite extender el uso del mismo y llevar tu código un paso más allá.
Es una herramienta de desarrollo a la cual yo le digo con qué estoy trabajando para que luego me ayude a escribir mi código. Resumiendo mucho… es como un contrato. Sabemos de antemano qué parámetros espera y qué nos devolverá la función. Por ejemplo.
¿Qué nos ofrece Typescript?
EcmaScript: Lo primero de todo, es que Typescript es Javascript que escala… Al implementar EcmaScript, está implementando el estándar de Javascript y eso es super importante porque a medida que EcmaScript evoluciona, Typescript evoluciona con él, compilando código que exista en el navegador sin necesidad de polyfills.
Tipado: Adición de tipos estáticos a Javascript: Esta información de tipos puede ayudar a que tu código de JavaScript sea más predecible y más fácil de razonar. Javascript tiene tipos muy básicos y sólo puedes saber realmente qué tipo tiene un objeto cuando estás en tiempo de ejecución. Gracias a Typescript y a los actuales IDE, podrás saber de antemano si tu código está bien o mal mientras lo escribes, ya que Typescript estará por detrás compilando continuamente avisándote en caso de que no reconozca como válidos los tipos que estás usando y que previamente has declarado, ya sea de forma implícita o explícita.
Clases: similar a ES6 pero con azúcar sintáctico de serie, por ejemplo, con Typescript se pueden declarar las propiedades públicas directamente en los parámetros del constructor.
Interfaces: te permite modelar los retornos de tu API, lo que significa que ya no necesitas saberte de memoria las propiedades de tus DTO, lo que se traduce en cometer menos errores léxicos… Con Typescript simplemente construimos una interface que cumpla el modelo que devuelve la llamada a la API y ya Typescript se encarga de tratar ese objeto como el modelo que le has dicho en todo tu código. Lo mejor de todo es que esta interface que nos ayuda a desarrollar, es código que nunca llegará al navegador con el consiguiente ahorro que eso conlleva. Yo al menos por eso utilizo las interfaces para modelar las APIs.
Tipos Genéricos. Alguno que venga de back con C# o Java, cuántas veces hemos echado en falta los genéricos, los tipos estáticos…
Intellisense: una parte fundamental del uso de Typescript es la integración con nuestro IDE. El autocompletado no sólo te muestra toda la definición de nuestro objeto con sus propiedades, métodos, etcétera… Es que te permite refactorizar tu código sin complicaciones, extraer funciones, renombrado...
Resumiendo, desarrollar con Typescript hará que tu aplicación sea a largo plazo más fácil de mantener, te evitará tener que testear muchas cosas que ya estás “testeando” de forma implícita, podrás usarlo cuando lo necesites ya que el tipado estático es opcional (dependiendo de la configuración que hayamos puesto en el tsconfig), podrás seguir usando Javascript moderno sin tener que aprender un lenguaje nuevo, y lo bueno de esto es que todo lo que hagas con Typescript, al final será Javascript compilado y entendible por tu navegador.
Y después de ver por encima, qué te aporta desarrollar con Typescript, veamos cómo se integra en un proyecto de Vue.
Existen varias formas de hacerlo, dependiendo de si se trata un proyecto nuevo o un proyecto ya iniciado.
Para un proyecto nuevo, lo mejor es utilizar la herramienta oficial de Vue. La Vue CLI.
Vue CLI es la herramienta estándar para el desarrollo de Vue y actualmente está en la versión 3.
Para poder usarla debemos tener instalado NODE e instalarla de forma global con NPM o YARN
NPM INSTALL –G @VUE/CLI o YARN GLOBAL ADD @VUE/CLI
Después de tenerla instalada de forma global en nuestro sistema, iniciamos un proyecto con el comando VUE CREATE y nombre del proyecto
Una vez iniciada la herramienta, debemos seleccionar la configuración manual para poder marcar la característica de Typescript
Una vez iniciada la herramienta, debemos seleccionar la configuración manual para poder marcar la característica de Typescript.
Ya tenemos nuestro proyecto listo para empezar a desarrollar componentes con Vue.
code jsday-sample/.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para un proyecto ya iniciado, si fue construido con Vue CLI utilizaremos el comando:
VUE ADD @VUE/TYPESCRIPT
Esta acción realizará cambios en los siguientes archivos:
Punto de entrada de aplicación: la convierte a la extensión ts
Agrega un archivo tsconfig con la configuración de Typescript.
Incluye la declaración de módulos necesaria para que Typescript pueda entender los archivos .vue cuando se importan.
Actualiza la definición del componente APP con estilo de clase, si lo hemos activado, y cambia las extensiones js a ts de los plugins oficiales de Vue
Como recomendación, no te olvides de haber realizado un commit anterior porque va a modificar varias cosas.
Y ahora veremos cómo integrar Typescript en un proyecto iniciado sin usar Vue CLI.
Para comenzar, debemos instalar los siguientes paquetes al proyecto:
Typescript, ts-loader, vue-class-component y vue-property-decorator
2) Lo siguiente será crear el archivo de configuración de Typescript
- Habilitar el MODO ESTRICTO o al menos el flag noImplicitThis para aprovechar la verificación de tipos THIS en los métodos de los componentes, de lo contrario será ignorado porque se tratará como ANY
3) Continuamos editando la configuración de webpack.
Cambiamos el punto de entrada de la aplicación a la extensión TS y le decimos que resuelva las extensiones TS
Creamos una regla para que los archivos con extensión Typescript, los cargue con el TS-LOADER
4) Agregamos la declaración de módulos para los archivos .VUE en el raíz
5) Por último, tenemos que renombrar las extensiones JS a TS dentro de la carpeta SRC
Y en los componentes VUE, cambiar la declaración de los scripts agregando LANG=“TS” y añadir la extensión .VUE a los componentes que se importan a los archivos.
Es la forma estándar de escribir tus componentes de Vue, por lo que todas las herramientas estándar funcionarán, por ejemplo, Vetur.
Te obliga a ser más organizado porque tienes que declarar cada cosa en su lugar. Al contrario que con la api basada en clases, que por ejemplo, puedes declarar métodos en cualquier parte de tu clase. Aquí no. Aquí todos los métodos estarán dentro del apartado métodos, el data igual, las propiedades computadas lo mismo, y así con todo. Creo que eso te brinda una forma más legible y organizada de mantener tu código, y eso se traduce en rapidez.
Como contras, la declaración de los $refs son un poco más liosas si quieres tiparlas, al igual que las PROPS con tipos complejos o arrays… luego lo veremos
Debido a la naturaleza circular de los archivos de declaración de Vue, Typescript puede tener dificultades para inferir los tipos de ciertos métodos.
Así que es necesario que se indique qué retorna las computed propierties.
Vue te permite diferentes maneras de definir un componente con Typescript.
Primero veamos qué nos aporta crear los componentes como ESTILO DE CLASE o DECORADORES.
Obviamente, definir tus componentes como una clase
Tenemos soporte oficial del paquete VUE-CLASS-COMPONENT y otro paquete, muy recomendable, VUE-CLASS-PROPERTY que extiende VUE-CLASS-COMPONENT.
Recuerda que para utilizar la api basada en clases, necesitas tener habilitado el flag –experimentalDecoratos en tu archivo tsconfig.json
DESVENTAJAS:
Libertad total a la hora de declarar tu componente. Que si bien, esto puede ser una ventaja a priori, creo que a la larga, al menos a mí me parece más una desventaja ya que puedes utilizar mal las funcionalidades que te aporta y crear un pequeño monstruo difícil de mantener. Además que si trabajas en equipo, se deben tener bien definidos los métodos de trabajo, la organización, o terminará siendo un caos.
VETUR NO SOPORTA la API de clases, así que no tienes intellisense en la parte del html template.
Existe poca documentación sobre su uso y la que hay, es muy básica.
Y algo importante, los bundles generados en comparación con Extend son más pesados.
Veamos un poco esto por encima… [muestra de cómo puedes definir lo que te dé la gana de forma desorganizada, muestra de cómo es más pesado]
! modificadores de aserción de asignación definida, sirve para afirmar que msg se asigna realmente.
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend
Si estamos migrando un proyecto o si no tenemos mucha experiencia con Typescript y Vue, tal vez tener el modo estricto habilitado sea un poco desmotivador, pero la recomendación es si no podemos lidiar al principio con este modo, habilitar al menos noImplicitThis y luego, por ejemplo, noImplicityAny, hasta que al final podamos habilitar el modo estricto.
Puedes seguir usando tus plugins simplemente aumentando los tipos.
Es necesario indicar qué tipo retorna las computed properties o no será capaz de inferir el tipo por la naturaleza circular de los archivos de declaración de Vue.
Ojo con cómo se declaran los tipos complejos o los Array en Extend