Mejora De La Calidad Del Código En Typescript Con Opciones De Compilac

Typescript es un lenguaje de programación desarrollado por Microsoft para brindar seguridad en términos de verificación estricta de tipos y seguridad de tipos, para el lenguaje Javascript. Es un superconjunto de Javascript que también se compila en Javascript. TypeScript proporciona varias opciones de compilación que cambian la forma en que funciona. Estas opciones tienen varios usos importantes, como eliminar comentarios o agregar una URL base para resolver los nombres de los módulos.

En este artículo, veremos las opciones para mejorar la calidad del código en TypeScript configurando adecuadamente algunas opciones.

El archivo tsconfig.json

El tsconfig.jsonarchivo alberga todas las opciones del compilador. La presencia muestra y especifica la presencia de la raíz del proyecto TypeScript. El archivo se puede obtener escribiendo el tsc --initcomando en la terminal. A continuación se muestran algunos ejemplos de algunas opciones del compilador.

{
    "compilerOptions": {
        "module": "system",
        "noImplicitAny": true,
        "removeComments": true,
        "allowUnreachableCode": false,
        "strictNullChecks": true,
        "target": "es5", 
        "module": "commonjs", 
        "rootDir": ".",
        "outDir": "../dist/",
        "sourceMap": true 
    }
}

En este artículo hablaremos sobre cómo mejorar la calidad del código con las opciones noUnusedLocals, noUnusedParameters, noImplicitReturns, noFallthroughCasesInSwitch, strictNullChecks, noImplicitAny, noImplicitThisy .strictBindCallApply

noUnusedLocals

Con esta opción establecida en verdadero, el compilador verificará y generará errores en las variables locales no utilizadas, de manera similar no-unused-varsa ESLint . Esta opción del compilador tiene como objetivo eliminar y eliminar las variables no utilizadas en Typescript. Considere el siguiente ejemplo:

const numHandler = (input: number) => {
  let digits;
  return input;
};

En el ejemplo anterior, definimos una función llamada numHandler, que toma un parámetro de tipo número. A continuación, definimos una digitsvariable y devolvimos el parámetro de entrada. Cuando compilamos el código anterior, se nos presenta el siguiente error de la terminal:

error TS6133: 'digits' is declared but its value is never read

Este error se produce porque declaramos la digitsvariable sin utilizarla. Puede deshacerse de este error utilizando el valor declarado en alguna parte del código o configurando la opción en el archivo tsconfig.json como falso.

noUnusedParameter

Esta opción del compilador es algo similar a la noUnusedLocalsopción. La diferencia es que mientras noUnusedLocalsgenera un error en las variables locales no utilizadas, noUnusedParametergenera un error cuando los parámetros de la función se declaran pero no se utilizan. Considere el siguiente ejemplo:

const anExample = (input: string) => {
  const someStrings = 'The name is Isaac'
  return { true, someStrings };
};

Definimos una función llamada anExample, que toma un stringparámetro de tipo. A continuación, definimos una variable llamada someStringsy luego devolvimos un valor booleano y la variable definida. Cuando compilamos el código anterior, se nos presenta el siguiente error de la terminal:

error TS6133: 'input' is declared but its value is never read

Esto sucede porque declaramos el inputparámetro en la función sin usarlo. Puede deshacerse de este error utilizando el parámetro declarado en el cuerpo de la función o configurando la opción en el tsconfig.jsonarchivo como falso.

noImplicitReturns

Esta opción del compilador asegura que cualquier función con una declaración de devolución devuelva algo. Esta opción genera un error cuando una ruta de código en una función no devuelve un valor. Considere el siguiente ejemplo:

function add(input: number, output: number) {
  if (input + output > 0) {
    return input + output;
  }
}

En el ejemplo anterior, definimos una función con dos parámetros de tipo número. A continuación, establecemos una sentencia if, que comprueba que la suma de ambos parámetros es mayor que cero, y luego devuelve esa suma. Con esta opción del compilador establecida en verdadero, el compilador genera el siguiente error de tipo:

error TS7030: Not all code paths return a value.

Typescript detecta aquí que no todas las rutas de código devuelven algo. No hay una returndeclaración para cuando la suma de los argumentos no es positiva, y esto puede introducir errores en nuestro código porque la función anterior devolverá undefined. Para resolver este problema, asegúrese de que todas las partes del código devuelvan algo. Considere la solución al código anterior a continuación:

function add(input: number, output: number) {
  if (input + output > 0) {
    return input + output;
  }
  return
}

Al usar la palabra clave return, nos aseguramos de que todas las partes de nuestro código devuelvan algo. La opción del compilador nos ayudó a detectar una posible situación faltante y evitar un error.

Reproducción de sesión de código abierto

OpenReplay es un conjunto de reproducción de sesiones de código abierto que le permite ver lo que hacen los usuarios en su aplicación web, lo que lo ayuda a solucionar problemas más rápido. OpenReplay es autohospedado para un control total sobre sus datos.

reproductor.png

Empiece a disfrutar de su experiencia de depuración: empiece a usar OpenReplay gratis .

noFallthroughCasesInSwitch

Cuando se establece en verdadero, esta opción del compilador genera errores cada vez que tenemos switchdeclaraciones que fluyen de una rama a la otra sin la palabra clave breako return. Considere el siguiente ejemplo:

let name = 'Isaac';
  
switch (name) {
  case 'Isaac':
    console.log('Isaac is a developer');
  case 'John':
    console.log('John is my friend');
    break;           
}

Cuando compilamos el código anterior, obtenemos el siguiente error.

error TS7029: Fallthrough case in switch

Esto sucede porque hay una breakpalabra clave omitida en la rama de la primera switchinstrucción. Puede haber ocasiones en las que tenga razones válidas para omitir dicha breakpalabra clave, pero a menudo es un error. Algunas soluciones a esto son:

  • Establecer noFallthroughCasesInSwitch en falso en el tsconfig.jsonarchivo
  • Use el // @ts-ignorecomando para suprimir el error

strictNullChecks

Esta opción del compilador verifica las instancias en las que Typescript espera un tipo concreto (número, cadena, booleano) pero se vuelve nulo o indefinido cuando se establece en verdadero. Esta opción nos ayuda a eliminar Uncaught TypeErrorerrores. Considere el siguiente ejemplo:

let title: string;
name = title;
console.log(name);

Cuando compilamos y ejecutamos el código anterior, obtenemos el siguiente error:

error TS2454: Variable 'title' is used before being assigned

La solución a este error es asignar un valor a la variable antes de usarla, como vemos en el bloque de código a continuación:

let title: string = "Student"
name = title
console.log(name)

noImplicitAny

Cada variable en Typescript tiene un tipo; o definimos el tipo o Typescript intenta adivinarlo. Considere el siguiente ejemplo:

function value(a) {
  return;
}

En el bloque de código anterior, tenemos una función con un argumento de a; dado que no definimos el tipo para ese argumento, Typescript infiere que el argumento tiene un anytipo. Con esta opción del compilador establecida en verdadero, el compilador genera el siguiente error:

error TS7006: Parameter 'a' implicitly has an 'any' type

La solución a esto es asegurarse de definir correctamente el tipo para cada argumento.

noImplicitThis

Con esta opción del compilador establecida en verdadero, TypeScript se quejará siempre que haya instancias en las que estemos usando la thispalabra clave incorrectamente o en un lugar que no esté claro thisa dónde se refiere.

class Person {
  weight: number;
  height: number;
  
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  }
  
  getBodyMassIndex() {
    return function () {
      return this.weight / (this.height * this.height);
    };
  }
}

Obtenemos el siguiente error cuando compilamos el código anterior debido al alcance en Javascript. Esto se debe a que el contexto de la thispalabra clave no está vinculado a ninguna instancia de Personforma predeterminada.

error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation

La solución a esto son las funciones de flecha. Esto funcionará porque las funciones de flecha usan el contexto de ejecución del padre :

class Person {
  weight: number;
  height: number;
  
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  }
  
  getBodyMassIndex() {
    return () => {
      return this.weight / (this.height * this.height);
    };
  }
}

strictBindCallApply

Esta opción del compilador garantiza que está utilizando las funciones y call()con los argumentos correctos.bind()apply()

const numHandler = (a: number) ={
  console.log(`log ${a}!`);
}

numHandler.call(undefined, 'Isaac')

Cuando ejecutamos el código anterior con esta opción del compilador establecida en verdadero, obtenemos un error:

error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'

Para resolver esto, necesitamos pasar el argumento correcto y el error se resolverá.

const numHandler = (a: number) ={
  console.log(`log ${a}!`)
}
    
numHandler.call(undefined, '25')

Conclusión

En este artículo, analizamos algunas opciones del compilador, los errores que generan, cómo resolverlos y cómo mejorar la calidad del código usándolos. Muchas otras opciones del compilador pueden ayudar con la calidad del código y puede consultarlas aquí .

Fuente: https://blog.openreplay.com/improving-code-quality-in-typescript-with-compiler-options

#typescript 

What is GEEK

Buddha Community

Mejora De La Calidad Del Código En Typescript Con Opciones De Compilac

Mejora De La Calidad Del Código En Typescript Con Opciones De Compilac

Typescript es un lenguaje de programación desarrollado por Microsoft para brindar seguridad en términos de verificación estricta de tipos y seguridad de tipos, para el lenguaje Javascript. Es un superconjunto de Javascript que también se compila en Javascript. TypeScript proporciona varias opciones de compilación que cambian la forma en que funciona. Estas opciones tienen varios usos importantes, como eliminar comentarios o agregar una URL base para resolver los nombres de los módulos.

En este artículo, veremos las opciones para mejorar la calidad del código en TypeScript configurando adecuadamente algunas opciones.

El archivo tsconfig.json

El tsconfig.jsonarchivo alberga todas las opciones del compilador. La presencia muestra y especifica la presencia de la raíz del proyecto TypeScript. El archivo se puede obtener escribiendo el tsc --initcomando en la terminal. A continuación se muestran algunos ejemplos de algunas opciones del compilador.

{
    "compilerOptions": {
        "module": "system",
        "noImplicitAny": true,
        "removeComments": true,
        "allowUnreachableCode": false,
        "strictNullChecks": true,
        "target": "es5", 
        "module": "commonjs", 
        "rootDir": ".",
        "outDir": "../dist/",
        "sourceMap": true 
    }
}

En este artículo hablaremos sobre cómo mejorar la calidad del código con las opciones noUnusedLocals, noUnusedParameters, noImplicitReturns, noFallthroughCasesInSwitch, strictNullChecks, noImplicitAny, noImplicitThisy .strictBindCallApply

noUnusedLocals

Con esta opción establecida en verdadero, el compilador verificará y generará errores en las variables locales no utilizadas, de manera similar no-unused-varsa ESLint . Esta opción del compilador tiene como objetivo eliminar y eliminar las variables no utilizadas en Typescript. Considere el siguiente ejemplo:

const numHandler = (input: number) => {
  let digits;
  return input;
};

En el ejemplo anterior, definimos una función llamada numHandler, que toma un parámetro de tipo número. A continuación, definimos una digitsvariable y devolvimos el parámetro de entrada. Cuando compilamos el código anterior, se nos presenta el siguiente error de la terminal:

error TS6133: 'digits' is declared but its value is never read

Este error se produce porque declaramos la digitsvariable sin utilizarla. Puede deshacerse de este error utilizando el valor declarado en alguna parte del código o configurando la opción en el archivo tsconfig.json como falso.

noUnusedParameter

Esta opción del compilador es algo similar a la noUnusedLocalsopción. La diferencia es que mientras noUnusedLocalsgenera un error en las variables locales no utilizadas, noUnusedParametergenera un error cuando los parámetros de la función se declaran pero no se utilizan. Considere el siguiente ejemplo:

const anExample = (input: string) => {
  const someStrings = 'The name is Isaac'
  return { true, someStrings };
};

Definimos una función llamada anExample, que toma un stringparámetro de tipo. A continuación, definimos una variable llamada someStringsy luego devolvimos un valor booleano y la variable definida. Cuando compilamos el código anterior, se nos presenta el siguiente error de la terminal:

error TS6133: 'input' is declared but its value is never read

Esto sucede porque declaramos el inputparámetro en la función sin usarlo. Puede deshacerse de este error utilizando el parámetro declarado en el cuerpo de la función o configurando la opción en el tsconfig.jsonarchivo como falso.

noImplicitReturns

Esta opción del compilador asegura que cualquier función con una declaración de devolución devuelva algo. Esta opción genera un error cuando una ruta de código en una función no devuelve un valor. Considere el siguiente ejemplo:

function add(input: number, output: number) {
  if (input + output > 0) {
    return input + output;
  }
}

En el ejemplo anterior, definimos una función con dos parámetros de tipo número. A continuación, establecemos una sentencia if, que comprueba que la suma de ambos parámetros es mayor que cero, y luego devuelve esa suma. Con esta opción del compilador establecida en verdadero, el compilador genera el siguiente error de tipo:

error TS7030: Not all code paths return a value.

Typescript detecta aquí que no todas las rutas de código devuelven algo. No hay una returndeclaración para cuando la suma de los argumentos no es positiva, y esto puede introducir errores en nuestro código porque la función anterior devolverá undefined. Para resolver este problema, asegúrese de que todas las partes del código devuelvan algo. Considere la solución al código anterior a continuación:

function add(input: number, output: number) {
  if (input + output > 0) {
    return input + output;
  }
  return
}

Al usar la palabra clave return, nos aseguramos de que todas las partes de nuestro código devuelvan algo. La opción del compilador nos ayudó a detectar una posible situación faltante y evitar un error.

Reproducción de sesión de código abierto

OpenReplay es un conjunto de reproducción de sesiones de código abierto que le permite ver lo que hacen los usuarios en su aplicación web, lo que lo ayuda a solucionar problemas más rápido. OpenReplay es autohospedado para un control total sobre sus datos.

reproductor.png

Empiece a disfrutar de su experiencia de depuración: empiece a usar OpenReplay gratis .

noFallthroughCasesInSwitch

Cuando se establece en verdadero, esta opción del compilador genera errores cada vez que tenemos switchdeclaraciones que fluyen de una rama a la otra sin la palabra clave breako return. Considere el siguiente ejemplo:

let name = 'Isaac';
  
switch (name) {
  case 'Isaac':
    console.log('Isaac is a developer');
  case 'John':
    console.log('John is my friend');
    break;           
}

Cuando compilamos el código anterior, obtenemos el siguiente error.

error TS7029: Fallthrough case in switch

Esto sucede porque hay una breakpalabra clave omitida en la rama de la primera switchinstrucción. Puede haber ocasiones en las que tenga razones válidas para omitir dicha breakpalabra clave, pero a menudo es un error. Algunas soluciones a esto son:

  • Establecer noFallthroughCasesInSwitch en falso en el tsconfig.jsonarchivo
  • Use el // @ts-ignorecomando para suprimir el error

strictNullChecks

Esta opción del compilador verifica las instancias en las que Typescript espera un tipo concreto (número, cadena, booleano) pero se vuelve nulo o indefinido cuando se establece en verdadero. Esta opción nos ayuda a eliminar Uncaught TypeErrorerrores. Considere el siguiente ejemplo:

let title: string;
name = title;
console.log(name);

Cuando compilamos y ejecutamos el código anterior, obtenemos el siguiente error:

error TS2454: Variable 'title' is used before being assigned

La solución a este error es asignar un valor a la variable antes de usarla, como vemos en el bloque de código a continuación:

let title: string = "Student"
name = title
console.log(name)

noImplicitAny

Cada variable en Typescript tiene un tipo; o definimos el tipo o Typescript intenta adivinarlo. Considere el siguiente ejemplo:

function value(a) {
  return;
}

En el bloque de código anterior, tenemos una función con un argumento de a; dado que no definimos el tipo para ese argumento, Typescript infiere que el argumento tiene un anytipo. Con esta opción del compilador establecida en verdadero, el compilador genera el siguiente error:

error TS7006: Parameter 'a' implicitly has an 'any' type

La solución a esto es asegurarse de definir correctamente el tipo para cada argumento.

noImplicitThis

Con esta opción del compilador establecida en verdadero, TypeScript se quejará siempre que haya instancias en las que estemos usando la thispalabra clave incorrectamente o en un lugar que no esté claro thisa dónde se refiere.

class Person {
  weight: number;
  height: number;
  
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  }
  
  getBodyMassIndex() {
    return function () {
      return this.weight / (this.height * this.height);
    };
  }
}

Obtenemos el siguiente error cuando compilamos el código anterior debido al alcance en Javascript. Esto se debe a que el contexto de la thispalabra clave no está vinculado a ninguna instancia de Personforma predeterminada.

error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation

La solución a esto son las funciones de flecha. Esto funcionará porque las funciones de flecha usan el contexto de ejecución del padre :

class Person {
  weight: number;
  height: number;
  
  constructor(weight: number, height: number) {
    this.weight = weight;
    this.height = height;
  }
  
  getBodyMassIndex() {
    return () => {
      return this.weight / (this.height * this.height);
    };
  }
}

strictBindCallApply

Esta opción del compilador garantiza que está utilizando las funciones y call()con los argumentos correctos.bind()apply()

const numHandler = (a: number) ={
  console.log(`log ${a}!`);
}

numHandler.call(undefined, 'Isaac')

Cuando ejecutamos el código anterior con esta opción del compilador establecida en verdadero, obtenemos un error:

error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'

Para resolver esto, necesitamos pasar el argumento correcto y el error se resolverá.

const numHandler = (a: number) ={
  console.log(`log ${a}!`)
}
    
numHandler.call(undefined, '25')

Conclusión

En este artículo, analizamos algunas opciones del compilador, los errores que generan, cómo resolverlos y cómo mejorar la calidad del código usándolos. Muchas otras opciones del compilador pueden ayudar con la calidad del código y puede consultarlas aquí .

Fuente: https://blog.openreplay.com/improving-code-quality-in-typescript-with-compiler-options

#typescript 

joe biden

1617257581

Software de restauración de Exchange para restaurar sin problemas PST en Exchange Server

¿Quiere restaurar los buzones de correo de PST a Exchange Server? Entonces, estás en la página correcta. Aquí, lo guiaremos sobre cómo puede restaurar fácilmente mensajes y otros elementos de PST a MS Exchange Server.

Muchas veces, los usuarios necesitan restaurar los elementos de datos de PST en Exchange Server, pero debido a la falta de disponibilidad de una solución confiable, los usuarios no pueden obtener la solución. Háganos saber primero sobre el archivo PST y MS Exchange Server.

Conozca PST y Exchange Server

PST es un formato de archivo utilizado por MS Outlook, un cliente de correo electrónico de Windows y muy popular entre los usuarios domésticos y comerciales.

Por otro lado, Exchange Server es un poderoso servidor de correo electrónico donde todos los datos se almacenan en un archivo EDB. Los usuarios generalmente guardan la copia de seguridad de los buzones de correo de Exchange en el archivo PST, pero muchas veces, los usuarios deben restaurar los datos del archivo PST en Exchange. Para resolver este problema, estamos aquí con una solución profesional que discutiremos en la siguiente sección de esta publicación.

Un método profesional para restaurar PST a Exchange Server

No le recomendamos que elija una solución al azar para restaurar los datos de PST en Exchange Server. Por lo tanto, al realizar varias investigaciones, estamos aquí con una solución inteligente y conveniente, es decir, Exchange Restore Software. Es demasiado fácil de manejar por todos los usuarios y restaurar cómodamente todos los datos del archivo PST a Exchange Server.

Funciones principales ofrecidas por Exchange Restore Software

El software es demasiado simple de usar y se puede instalar fácilmente en todas las versiones de Windows. Con unos pocos clics, la herramienta puede restaurar los elementos del buzón de Exchange.

No es necesario que MS Outlook restaure los datos PST en Exchange. Todos los correos electrónicos, contactos, notas, calendarios, etc. se restauran desde el archivo PST a Exchange Server.

Todas las versiones de Outlook son compatibles con la herramienta, como Outlook 2019, 2016, 2013, 2010, 2007, etc. La herramienta proporciona varios filtros mediante los cuales se pueden restaurar los datos deseados desde un archivo PST a Exchange Server. El programa se puede instalar en todas las versiones de Windows como Windows 10, 8.1, 8, 7, XP, Vista, etc.

Descargue la versión de demostración del software de restauración de Exchange y analice el funcionamiento del software restaurando los primeros 50 elementos por carpeta.

Líneas finales

No existe una solución manual para restaurar los buzones de correo de Exchange desde el archivo PST. Por lo tanto, hemos explicado una solución fácil e inteligente para restaurar datos de archivos PST en Exchange Server. Simplemente puede usar este software y restaurar todos los datos de PST a Exchange Server.

Más información:- https://www.datavare.com/software/exchange-restore.html

#intercambio de software de restauración #intercambio de restauración #buzón del servidor de intercambio #herramienta de restauración de intercambio

The Definitive Guide to TypeScript & Possibly The Best TypeScript Book

TypeScript Deep Dive

I've been looking at the issues that turn up commonly when people start using TypeScript. This is based on the lessons from Stack Overflow / DefinitelyTyped and general engagement with the TypeScript community. You can follow for updates and don't forget to ★ on GitHub 🌹

Reviews

  • Thanks for the wonderful book. Learned a lot from it. (link)
  • Its probably the Best TypeScript book out there. Good Job (link)
  • Love how precise and clear the examples and explanations are! (link)
  • For the low, low price of free, you get pages of pure awesomeness. Chock full of source code examples and clear, concise explanations, TypeScript Deep Dive will help you learn TypeScript development. (link)
  • Just a big thank you! Best TypeScript 2 detailed explanation! (link)
  • This gitbook got my project going pronto. Fluent easy read 5 stars. (link)
  • I recommend the online #typescript book by @basarat you'll love it.(link)
  • I've always found this by @basarat really helpful. (link)
  • We must highlight TypeScript Deep Dive, an open source book.(link)
  • Great online resource for learning. (link)
  • Thank you for putting this book together, and for all your hard work within the TypeScript community. (link)
  • TypeScript Deep Dive is one of the best technical texts I've read in a while. (link)
  • Thanks @basarat for the TypeScript Deep Dive Book. Help me a lot with my first TypeScript project. (link)
  • Thanks to @basarat for this great #typescript learning resource. (link)
  • Guyz excellent book on Typescript(@typescriptlang) by @basarat (link)
  • Leaning on the legendary @basarat's "TypeScript Deep Dive" book heavily at the moment (link)
  • numTimesPointedPeopleToBasaratsTypeScriptBook++; (link)
  • A book not only for typescript, a good one for deeper JavaScript knowledge as well. link
  • In my new job, we're using @typescriptlang, which I am new to. This is insanely helpful huge thanks, @basarat! link
  • Thank you for writing TypeScript Deep Dive. I have learned so much. link
  • Loving @basarat's @typescriptlang online book basarat.gitbooks.io/typescript/# loaded with great recipes! link
  • Microsoft doc is great already, but if want to "dig deeper" into TypeScript I find this book of great value link
  • Thanks, this is a great book 🤓🤓 link
  • Deep dive to typescript is awesome in so many levels. i find it very insightful. Thanks link
  • @basarat's intro to @typescriptlang is still one of the best going (if not THE best) link
  •  
  • This is sweet! So many #typescript goodies! link

Get Started

If you are here to read the book online get started.

Translations

Book is completely free so you can copy paste whatever you want without requiring permission. If you have a translation you want me to link here. Send a PR.

Other Options

You can also download one of the Epub, Mobi, or PDF formats from the actions tab by clicking on the latest build run. You will find the files in the artifacts section.

Special Thanks

All the amazing contributors 🌹

Share

Share URL: https://basarat.gitbook.io/typescript/

Author: Basarat
Source Code: https://github.com/basarat/typescript-book/ 
License: View license

#typescript #opensource 

Mejorando La Calidad Del Código En Typescript Parte 2

Cambiar de JavaScript a Typescript es una gran mejora en cualquier base de código. El cambio se puede hacer aún mejor y mejorar yendo más allá de las funciones predeterminadas de mecanografiado, lo que hace que nuestra base de código sea mucho más segura. Para lograr esto, necesitaremos incluir algunas opciones del compilador de TypeScript. Las opciones del compilador son propiedades en el tsconfig.jsonarchivo que se pueden habilitar y deshabilitar para mejorar nuestra experiencia con TypeScript. Es importante tener en cuenta que a medida que Typescript evolucione, se crearán nuevas banderas; por lo tanto, se recomienda que revise la documentación mecanografiada y vea si alguna bandera nueva puede ser de su interés al momento de leer esto.

Este artículo es la parte 2 de Mejora de la calidad del código TypeScript con opciones del compilador . Aquí cubriremos más opciones en el tsconfig.jsonarchivo y cómo mejorar la calidad del código con las opciones strictPropertyInitialization, useUnknownInCatchVariables, strictFunctionTypes, allowUnusedLabels, allowUnreachableCode, noPropertyAccessFromIndexSignature, exactOptionalPropertyTypey forceConsistentCasingInFileNames.

el tsconfig.jsonarchivo

Todas las opciones del compilador se guardan en el tsconfig.jsonarchivo, generado al ejecutarse tsc --initen la terminal raíz de nuestro proyecto. En esta publicación, agregaremos al tsconfig.jsonarchivo las opciones de compilación más utilizadas y demostraremos la nueva funcionalidad que introducen en nuestro código. Agregaremos las siguientes opciones del compilador para mejorar la calidad del código:

"compilerOptions": {
    "module": "system",
    "strictPropertyInitialization": true,
    "useUnknownInCatchVariables": true,
    "strictFunctionTypes": true,
    "allowUnusedLabels": false,
    "allowUnreachableCode": false,
    "noPropertyAccessFromIndexSignature": true,
    "exactOptionalPropertyType": true,
    "forceConsistentCasingInFileNames": true,
    "target": "es5", 
    "module": "commonjs", 
    "rootDir": ".",
    "outDir": "../dist/",
    "sourceMap": true 
}

strictPropertyInitialization

Cuando se establece en verdadero, esta opción del compilador garantiza que inicialicemos todas las propiedades de clase dentro de un constructor.

class User{
    name: string;
    age: number;
    occupation: string | undefined;
    
    constructor(name: string) {
        this.name = name;
    }
}

Tenemos una Userclase en el bloque de código de arriba, y el método constructor() es donde inicializamos las propiedades de su instancia. JavaScript llama automáticamente al método constructor() cuando instanciamos un objeto de clase. Typescript requiere que inicialicemos las propiedades que definimos o especifiquemos un tipo de undefined. Por lo tanto, cuando compilamos el código anterior, obtenemos el error que se muestra a continuación:

error TS2564: Property 'age' has no initializer and is not definitely assigned in the constructor.

Las variables no definidas en nuestro código no se pueden ignorar con esta opción.

useUnknownInCatchVariables

En Javascript, podemos arrojar un error y atraparlo en una catchcláusula. A menudo, esto será una instancia de error y está configurado anyde manera predeterminada. Cuando la useUnknownInCatchVariableopción del compilador se establece en verdadero, implícitamente establece cualquier variable en una catchcláusula en unknownlugar de any. Considere el siguiente ejemplo:

try {
    // random code...
      throw 'myException'; 
}
catch (err) {
    console.error(err.message); 
}

Cuando compilamos el código anterior, con useUnknownInCatchVariablesel valor verdadero, cambia nuestro error a un unknowntipo. Por lo tanto, obtenemos el siguiente error de la terminal.

error TS2571: Object is of type 'unknown'.

Este error se produce porque Typescript configuró el error unknown. Para corregir este error, podemos:

  • Limite el error de unknowna una instancia de Error.
try {
  // random code...
    throw 'myException'; 
}
catch (err) { // err: unknown
  if (err instanceof Error) {
    console.error(err.message);
  }
}
try {
  // random code...
  throw "myException";
} catch (err) {
  // Use the type guard
  // error is now narrowed to definitely be a string
  if (typeof err === "string") {
    console.error(err);
  }
}

Con la ayuda de nuestra ifverificación, Typescript reconoce que typeof err === "string"es una forma especial de código donde declaramos y describimos tipos explícitamente. Esto se conoce como tipo de protección .

strictFunctionTypes

Cuando strictFunctionTypeses verdadero, los parámetros de la función se verifican más a fondo. Los parámetros de texto mecanografiado son bivariantes de forma predeterminada, lo que implica que pueden ser tanto covariantes como contravariantes. La varianza es una forma de obtener información sobre las relaciones de subtipificación. Cuando el parámetro es la covarianza, podemos asignar un tipo específico a un tipo más amplio (por ejemplo, asignar un subtipo a un supertipo). La contravarianza es lo contrario; aquí, podemos asignar un tipo más amplio a un tipo específico (por ejemplo, asignar un supertipo a un subtipo). Tenemos covarianza y contravarianza en bivarianza. Para obtener más información sobre la varianza, haga clic aquí .

//strictFunctionTypes: false

interface Animal {
  name: string;
}

interface Dog extends Animal {
  breeds: Array<string>;
}

let getDogName = (dog: Dog) => dog.name;
let getAnimalName = (animal: Animal) => animal.name;

getDogName = getAnimalName;  // Okay
getAnimalName = getDogName;  // Okay

El código anterior se ejecuta sin errores y los parámetros se comparan de forma bivariante de forma predeterminada. El método del supertipo getAnimalNamey el subtipo getDogNamese pueden asignar entre sí. Los parámetros de TypeScript se comparan contravariantemente si strictFunctionTypesse establece entrue

//strictFunctionTypes : true

interface Animal {
  name: string;
}

interface Dog extends Animal {
  breeds: Array<string>;
}

let getDogName = (dog: Dog) => dog.name;
let getAnimalName = (animal: Animal) => animal.name;

getDogName = getAnimalName; // Okay
getAnimalName = getDogName; // Error

Cuando se ejecuta el bloque de código anterior, obtenemos un error:

Type '(dog: Dog) => string' is not assignable to type '(animal: Animal) => string'.
Types of parameters 'dog' and 'animal' are incompatible.
Property 'breeds' is missing in type 'Animal' but required in type 'Dog'.

Aquí, getAnimalNamees una función más amplia que getDogName. Como resultado, el supertipo no se puede asignar al subtipo en este caso. Sin embargo, se puede asignar un subtipo a un supertipo. La mayoría de las veces, los parámetros de la función deben ser contravariantes, no bivariantes. Si habilitamos esta opción de mecanografiado, Typescript no tratará los parámetros de la función como bivariantes.

Reproducción de sesión de código abierto

OpenReplay es un conjunto de reproducción de sesiones de código abierto que le permite ver lo que hacen los usuarios en su aplicación web, lo que lo ayuda a solucionar problemas más rápido. OpenReplay es autohospedado para un control total sobre sus datos.

reproductor.png

Empiece a disfrutar de su experiencia de depuración: empiece a usar OpenReplay gratis .

allowUnusedLabels

Una declaración de etiqueta en JavaScript se usa para prefijar una etiqueta como identificador. Las declaraciones de etiquetas en JavaScript son similares a los puntos de control en nuestro código. Debido a que la palabra clave label no es una palabra clave reservada en JavaScript, podemos representarla con cualquier cadena que no sea una palabra reservada y que vaya seguida de dos puntos :. La sintaxis para declarar una etiqueta es similar a la sintaxis para declarar un objeto en JavaScript. La mayoría de los desarrolladores cometen el error de declarar etiquetas en lugar de objetos. Para evitar esto, Typescript nos brinda la allowUnusedLabelsopción que, cuando se establece en false, hace que Typescript arroje un error que resalta las etiquetas no utilizadas en nuestro código.

const isUserAgeValid = (age: number) => {
  if (age > 18) {
    curfew: true; //-- COMPILER ERROR - Unused label
  }
};

En el código anterior, curfewes una etiqueta. Se generará el siguiente error cuando se compile el bloque de código:

error TS7028: Unused label

allowUnreachableCode

El código inalcanzable nunca se ejecutará, como un código que sigue a una declaración de devolución. Cuando esta opción del compilador se establece en true, los códigos inalcanzables se ignoran. Por el contrario, TypeScript verifica nuestras rutas de código cuando allowUnreachableCodese establece en false, lo que garantiza que se pueda acceder a todos los códigos y utilizarlos. Cuando se establece en verdadero, se genera un error si se detecta algún código inalcanzable.

const randomNum = (n: number): boolean => {
  if (n > 5) {
    return true;
  } else {
    return false;
  }
    
  return true;
};

Si se demuestra que un código es inalcanzable, Typescript mostrará esta advertencia:

error TS7027: Unreachable code detected.

noPropertyAccessFromIndexSignature

Cuando esta opción del compilador se establece en true, requiere que accedamos a propiedades desconocidas usando notación de []corchetes y .dotnotación para acceder a propiedades definidas. Esto promueve la consistencia porque la propiedad a la que se accede con notación de puntos siempre indica una propiedad existente. (obj.key) syntaxMientras que usamos la notación de corchetes [] si la propiedad no existe. obj["key"].

interface HorseRace {
  // defined properties
  breed: "Shetland" | "Hackney" | "Standardbred";
  speed: "fast" | "slow";

  //index signature for properties yet to be defined
  [key: string]: string;
}

declare const pick: HorseRace;

pick.breed;
pick.speed;
pick.ownerName;

En el ejemplo anterior, definimos una interfaz HorseRacey le asignamos algunas propiedades, como raza, velocidad y una firma de índice (para propiedades desconocidas). Recibimos este error cuando compilamos el código anterior.

error TS4111: Property 'ownerName' comes from an index signature, so it must be accessed with ['ownerName'].

Para corregir este error, use la notación de corchetes cuando llame a la propiedad ownerName.

pick.breed;
pick.speed;
pick["ownerName"]

exactOptionalPropertyType

De forma predeterminada, Typescript ignora si una propiedad está configurada como "indefinida" porque no estaba definida o porque la configuramos de esa manera.

//exactOptionalPropertyTypes = false

interface Test {
  property?: string;
}

const test1: Test = {};
console.log("property" in test1); //=> false

const test2: Test = { property: undefined };
console.log("property" in test2);

El bloque de código anterior se ejecutaría sin error, registro falsey truevalores. En test1, estamos comprobando si propertyse definió; si no fuera así, registra un false. En test2, el valor truese registra porque lo definimos propertyy lo configuramos propertyen undefined. A continuación, establezcamos la exactOptionalPropertyTypesopción en true.

//exactOptionalPropertyTypes = true

interface Test {
  property?: string;
}

const test1: Test = {};
console.log("property" in test1); // false

const test2: Test = { property: undefined };
console.log("property" in test2);  // true

Cuando se compila el bloque de código anterior, se registrará el siguiente error:

error TS2375: Type '{ property: undefined; }' is not assignable to type 'Test' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties. Types of property 'property' are incompatible. Type 'undefined' is not assignable to type 'string'.

Lo que sucedió aquí es que Typescript se negó a permitirnos definir un propertyde undefined. If propertyno está anotado explícitamente en un tipo de undefinedfirst. Para solucionar esto, podemos anotar el propertycon el tipo undefined.

//exactOptionalPropertyTypes = true

interface Test {
  property?: string | undefined;
}

const test1: Test = {};
console.log("property" in test1); //false

const test2: Test = { property: undefined };
console.log("property" in test2);  //true

Nuestro código vuelve a funcionar sin problemas, registrando falsey truevalores. TypeScript se da cuenta de estas dos formas diferentes de tener una propiedad indefinida cuando exactOptionalPropertyTypesestá habilitado. También asegura que si queremos definir explícitamente una propiedad como undefined, primero debe anotarse con el tipo undefined.

forceConsistentCasingInFileNames

Esta es una opción de compilador muy recomendada entre los equipos y anima a los miembros del equipo a utilizar las mejores prácticas y ser coherentes. Cuando esta opción se establece en false, se siguen las reglas de distinción entre mayúsculas y minúsculas del sistema operativo (SO) en el que se ejecuta Typescript. Podría distinguir entre mayúsculas y minúsculas (el sistema operativo distingue entre mayúsculas y minúsculas en los nombres de archivo) o no distinguir entre mayúsculas y minúsculas (el sistema operativo no distingue entre mayúsculas y minúsculas). Cuando forceConsistentCasingInFileNamesla opción se establece en true, TypeScript generará un error si intentamos importar un archivo con un nombre que difiere del nombre del archivo en el disco.

// StringValidator.ts

export interface StringValidator {
  isAcceptable(s: string): boolean;
}
// ZipCodeValidator.ts

import { StringValidator } from "./stringValidator";

export const numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
  isAcceptable(s: string) {
    return s.length === 5 && numberRegexp.test(s);
  }
}

Sin considerar el caso del nombre del archivo, importamos el StringValidatorarchivo en el código anterior. Si forceConsistentCasingInFileNamesla opción se establece en true, se generará un error:

error TS1149: File name 'C:/Users/acer/Desktop/workBase/writing/Typescript/tsc/stringValidator.ts' differs from already included file name 'C:/Users/acer/Desktop/workBase/writing/Typescript/tsc/StringValidator.ts' only in casing.

Para resolver esto, use el carácter exacto para el nombre de su archivo al importar.

Conclusión

Este artículo analizó detenidamente algunas opciones del compilador, los errores que generan, cómo resolverlos y cómo mejorar la calidad del código usándolos. Aquí se pueden encontrar muchas otras opciones del compilador que pueden ayudar con la calidad del código .

 Fuente: https://blog.openreplay.com/improving-code-quality-in-typescript-with-compiler-options-part-2

#typescript 

joe biden

1617255938

¿Cómo migrar los buzones de correo de Exchange a la nube de Office 365?

Si tiene problemas para migrar los buzones de correo de Exchange a Office 365, debe leer este artículo para saber cómo migrar los buzones de correo de Exchange EDB a Office 365. Al migrar a Office 365, los usuarios pueden acceder a sus buzones de correo desde cualquier lugar y desde cualquier dispositivo.

En esta publicación, explicaremos las razones detrás de esta migración y una solución profesional para migrar de Exchange a Office 365.

Razones para migrar Exchange Server a la nube de Office 365

Office 365 apareció por primera vez en 2011 y, dado que se considera la mejor plataforma para aquellas organizaciones que desean administrar todo su sistema de correo electrónico en la nube. Estas son las características clave de Office 365:

  1. Permite trabajar desde cualquier lugar y desde cualquier lugar.
  2. No se preocupe por el spam y el malware.
  3. La seguridad proporcionada por Office 365 es altamente confiable.
  4. Controla el costo total y brinda flexibilidad financiera.
  5. Todas las actualizaciones y mejoras son administradas por Microsoft.

¿Cómo migrar los buzones de correo de Exchange a Office 365?

Hay varias formas manuales de migrar los buzones de correo de Exchange EDB a Office 365, pero para evitar estos complicados y prolongados procedimientos, presentamos una solución de terceros, es decir, la herramienta de migración de Exchange, que es automatizada y directa para la migración de Exchange a Office 365. La herramienta funciona rápidamente y migra todos los elementos del buzón de Exchange Server a Office 365.

La herramienta de migración de Datavare Exchange es demasiado fácil de usar y ofrece pasos sencillos para migrar EDB a Office 365:

  1. Descargue e instale el software en su sistema.
  2. Agregue el archivo EDB de Exchange con el botón Examinar.
  3. Seleccione exportar a buzones de correo de Office 365.
  4. Proporcione los detalles de inicio de sesión de la cuenta de Office 365.
  5. Seleccione la carpeta y presione el botón Finalizar.

Por lo tanto, todos sus buzones de correo de Exchange EDB ahora se migran a Office 365.
Nota: puede usar filtros para migrar los elementos de datos deseados de la cuenta de Exchange a la de Office 365

Líneas finales

Este blog le indica una solución profesional para la migración de buzones de correo de Exchange a la cuenta de Office 365. Dado que las soluciones manuales son complicadas, sugerimos la herramienta de migración de Exchange, que es demasiado simple de usar. Los usuarios no se enfrentan a problemas al operar el programa. La mejor parte de este software es que no necesita habilidades técnicas para realizar la migración. Se puede comprender el funcionamiento del software descargando la versión de demostración que permite la migración de los primeros 50 elementos por carpeta.

Más información:- https://www.datavare.com/software/edb-migration.html

#herramienta de migración de intercambio #migración de intercambio #migrar buzones de correo de exchange