SlideShare una empresa de Scribd logo
1 de 40
Vue + Typescript:
Decorators vs Extend, Fight!
Integrando Typescript en tus proyectos de Vue
Sara Lissette Luis Ibáñez
@LissetteIbnz
¿Por qué usar Typescript?
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
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”
Cómo integrar Typescript
● Mediante el uso de Vue CLI
$ npm install -g @vue/cli
$ vue create name-project
Proyecto nuevo
Inicia Vue CLI
https://cli.vuejs.org/
Elige un preset
Proyecto nuevo
Inicia Vue CLI
https://cli.vuejs.org/
? Please pick a preset:
default (babel, eslint)
> Manually select features
? 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/
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/
Proyecto iniciado
Si el proyecto fue construido con
Vue CLI utilizaremos el comando:
vue add @vue/typescript
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
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,
· · ·
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,
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;
}
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, …
Agregamos los siguientes paquetes al
proyecto:
typescript
ts-loader
vue-class-component [o]
vue-property-decorator [o]
npm install –D typescript ts-loader
Instalamos paquetes
Proyecto iniciado
Creamos un tsconfig.json
Instalamos paquetes
Proyecto iniciado
{
"compilerOptions": {
"lib": ["dom", "es5", "es2015"],
"target": "es5",
"module": "es2015",
"moduleResolution": "node",
"sourceMap": true,
"allowSyntheticDefaultImports": true,
"noImplicitThis": true,
"noImplicitAny": true,
"experimentalDecorators": true }
}
Configuración webpack
Creamos un tsconfig.json
Instalamos paquetes
Proyecto iniciado
· · ·
entry: {
app: './src/main.ts',
},
· · ·
resolve: {
extensions: ['.ts', '.js', '.vue'],
· · ·
Configuración webpack
Creamos un tsconfig.json
Instalamos paquetes
Proyecto iniciado
module: {
rules: [
· · ·
{
test: /.ts$/,
loader: 'ts-loader’,
options: {
appendTsSuffixTo: [/.vue$/]
},
},
· · ·
Configuración webpack
Creamos un tsconfig.json
Instalamos paquetes
Declaración de módulos
Proyecto iniciado
declare module '*.vue’ {
import Vue from 'vue’;
export default Vue;
}
<script lang="ts">
import HelloWorld from
'./components/HelloWorld.vue';
export default Vue.extend({
name: 'App’,
components: { HelloWorld }
});
</script>
Configuración webpack
Creamos un tsconfig.json
Instalamos paquetes
Declaración de módulos
Actualizar componentes
Proyecto iniciado
Definiendo componentes
Vue.extend
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
+
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);
},
},
})
Live demo
Decorators o Class-Style
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, …)
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
+
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>
Live demo
A tener en cuenta
+
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)
+
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);
+
A tener en cuenta
● Configurar noImplicitThis: true y noImplicitAny: true
● Puedes aumentar tus tipos para tus plugins
● Indicar qué tipo retorna las computed properties
+
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,
},
+
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({
· · ·
+
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
¡Muchas gracias!
github.com/LissetteIbnz/jsday2018-vue-ts

Más contenido relacionado

La actualidad más candente

Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetesGabriel Carro
 
DevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdfDevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdfDevOps Tec
 
Read-only rootfs: theory and practice
Read-only rootfs: theory and practiceRead-only rootfs: theory and practice
Read-only rootfs: theory and practiceChris Simmonds
 
Linux device driver
Linux device driverLinux device driver
Linux device driverchatsiri
 
Yocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerYocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerSherif Mousa
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansibleKhizer Naeem
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with AnsibleSwapnil Jain
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansibleOmid Vahdaty
 
Default GitLab CI Pipeline - Auto DevOps
Default GitLab CI Pipeline - Auto DevOpsDefault GitLab CI Pipeline - Auto DevOps
Default GitLab CI Pipeline - Auto DevOpsRajith Bhanuka Mahanama
 
Ansible tips & tricks
Ansible tips & tricksAnsible tips & tricks
Ansible tips & tricksbcoca
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins IntroductionPavan Gupta
 
GitLab for CI/CD process
GitLab for CI/CD processGitLab for CI/CD process
GitLab for CI/CD processHYS Enterprise
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et DockerStephane Manciot
 

La actualidad más candente (20)

Ansible - Introduction
Ansible - IntroductionAnsible - Introduction
Ansible - Introduction
 
Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetes
 
SELinux Basic Usage
SELinux Basic UsageSELinux Basic Usage
SELinux Basic Usage
 
DevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdfDevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdf
 
Gitlab ci-cd
Gitlab ci-cdGitlab ci-cd
Gitlab ci-cd
 
Read-only rootfs: theory and practice
Read-only rootfs: theory and practiceRead-only rootfs: theory and practice
Read-only rootfs: theory and practice
 
Linux device driver
Linux device driverLinux device driver
Linux device driver
 
Automating with Ansible
Automating with AnsibleAutomating with Ansible
Automating with Ansible
 
Yocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution MakerYocto - Embedded Linux Distribution Maker
Yocto - Embedded Linux Distribution Maker
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansible
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with Ansible
 
Docker, LinuX Container
Docker, LinuX ContainerDocker, LinuX Container
Docker, LinuX Container
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansible
 
Default GitLab CI Pipeline - Auto DevOps
Default GitLab CI Pipeline - Auto DevOpsDefault GitLab CI Pipeline - Auto DevOps
Default GitLab CI Pipeline - Auto DevOps
 
Ansible tips & tricks
Ansible tips & tricksAnsible tips & tricks
Ansible tips & tricks
 
Ansible
AnsibleAnsible
Ansible
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins Introduction
 
GitLab for CI/CD process
GitLab for CI/CD processGitLab for CI/CD process
GitLab for CI/CD process
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et Docker
 
Jenkins
JenkinsJenkins
Jenkins
 

Similar a Vue + Typescript: Decorators vs. Extend, Fight!

Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Gabriela Bosetti
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxEvolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxLuis775803
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7Luis Ruiz Pavón
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLabFIB
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPablo Aguilera
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y BackEric Zeidan
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonMario García
 
Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Juan Fede
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)javier_ot99
 
Integrando Swift y Objective-C
Integrando Swift y Objective-CIntegrando Swift y Objective-C
Integrando Swift y Objective-CErick Camacho
 

Similar a Vue + Typescript: Decorators vs. Extend, Fight! (20)

Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxEvolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Ebook tutorialspringbootheroku
Ebook tutorialspringbootherokuEbook tutorialspringbootheroku
Ebook tutorialspringbootheroku
 
Webpack desde cero
Webpack desde ceroWebpack desde cero
Webpack desde cero
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier Aznar
 
spring-boot-es
spring-boot-esspring-boot-es
spring-boot-es
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y Back
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con Griffon
 
Tutorial net beans
Tutorial net beansTutorial net beans
Tutorial net beans
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Mvc
MvcMvc
Mvc
 
Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)
 
Mi app-asp-net-mvc2
Mi app-asp-net-mvc2Mi app-asp-net-mvc2
Mi app-asp-net-mvc2
 
Integrando Swift y Objective-C
Integrando Swift y Objective-CIntegrando Swift y Objective-C
Integrando Swift y Objective-C
 

Último

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 

Último (19)

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 

Vue + Typescript: Decorators vs. Extend, Fight!

  • 1. Vue + Typescript: Decorators vs Extend, Fight! Integrando Typescript en tus proyectos de Vue
  • 2. Sara Lissette Luis Ibáñez @LissetteIbnz
  • 3. ¿Por qué usar Typescript?
  • 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, …
  • 17. Agregamos los siguientes paquetes al proyecto: typescript ts-loader vue-class-component [o] vue-property-decorator [o] npm install –D typescript ts-loader Instalamos paquetes Proyecto iniciado
  • 18. Creamos un tsconfig.json Instalamos paquetes Proyecto iniciado { "compilerOptions": { "lib": ["dom", "es5", "es2015"], "target": "es5", "module": "es2015", "moduleResolution": "node", "sourceMap": true, "allowSyntheticDefaultImports": true, "noImplicitThis": true, "noImplicitAny": true, "experimentalDecorators": true } }
  • 19. Configuración webpack Creamos un tsconfig.json Instalamos paquetes Proyecto iniciado · · · entry: { app: './src/main.ts', }, · · · resolve: { extensions: ['.ts', '.js', '.vue'], · · ·
  • 20. Configuración webpack Creamos un tsconfig.json Instalamos paquetes Proyecto iniciado module: { rules: [ · · · { test: /.ts$/, loader: 'ts-loader’, options: { appendTsSuffixTo: [/.vue$/] }, }, · · ·
  • 21. Configuración webpack Creamos un tsconfig.json Instalamos paquetes Declaración de módulos Proyecto iniciado declare module '*.vue’ { import Vue from 'vue’; export default Vue; }
  • 22. <script lang="ts"> import HelloWorld from './components/HelloWorld.vue'; export default Vue.extend({ name: 'App’, components: { HelloWorld } }); </script> Configuración webpack Creamos un tsconfig.json Instalamos paquetes Declaración de módulos Actualizar componentes Proyecto iniciado
  • 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>
  • 33. A tener en cuenta
  • 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

Notas del editor

  1. 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).
  2. 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.
  3. 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.
  4. ¿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...
  5. 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.
  6. 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.
  7. 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
  8. Una vez iniciada la herramienta, debemos seleccionar la configuración manual para poder marcar la característica de Typescript
  9. Una vez iniciada la herramienta, debemos seleccionar la configuración manual para poder marcar la característica de Typescript.
  10. Ya tenemos nuestro proyecto listo para empezar a desarrollar componentes con Vue. code jsday-sample/.
  11. 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.
  12. 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.
  13. 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.
  14. 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.
  15. 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.
  16. 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.
  17. Para comenzar, debemos instalar los siguientes paquetes al proyecto: Typescript, ts-loader, vue-class-component y vue-property-decorator
  18. 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
  19. 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
  20. Creamos una regla para que los archivos con extensión Typescript, los cargue con el TS-LOADER
  21. 4) Agregamos la declaración de módulos para los archivos .VUE en el raíz
  22. 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.
  23. 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
  24. 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.
  25. 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
  26. 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]
  27. ! modificadores de aserción de asignación definida, sirve para afirmar que msg se asigna realmente.
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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