1659040380
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 tsconfig.json
archivo 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 --init
comando 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
, noImplicitThis
y .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-vars
a 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 digits
variable 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 digits
variable 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 noUnusedLocals
opción. La diferencia es que mientras noUnusedLocals
genera un error en las variables locales no utilizadas, noUnusedParameter
genera 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 string
parámetro de tipo. A continuación, definimos una variable llamada someStrings
y 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 input
pará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.json
archivo 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 return
declaració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.
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.
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 switch
declaraciones que fluyen de una rama a la otra sin la palabra clave break
o 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 break
palabra clave omitida en la rama de la primera switch
instrucción. Puede haber ocasiones en las que tenga razones válidas para omitir dicha break
palabra clave, pero a menudo es un error. Algunas soluciones a esto son:
tsconfig.json
archivo// @ts-ignore
comando para suprimir el errorstrictNullChecks
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 TypeError
errores. 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 any
tipo. 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 this
palabra clave incorrectamente o en un lugar que no esté claro this
a 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 this
palabra clave no está vinculado a ninguna instancia de Person
forma 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')
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
1659040380
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 tsconfig.json
archivo 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 --init
comando 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
, noImplicitThis
y .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-vars
a 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 digits
variable 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 digits
variable 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 noUnusedLocals
opción. La diferencia es que mientras noUnusedLocals
genera un error en las variables locales no utilizadas, noUnusedParameter
genera 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 string
parámetro de tipo. A continuación, definimos una variable llamada someStrings
y 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 input
pará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.json
archivo 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 return
declaració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.
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.
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 switch
declaraciones que fluyen de una rama a la otra sin la palabra clave break
o 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 break
palabra clave omitida en la rama de la primera switch
instrucción. Puede haber ocasiones en las que tenga razones válidas para omitir dicha break
palabra clave, pero a menudo es un error. Algunas soluciones a esto son:
tsconfig.json
archivo// @ts-ignore
comando para suprimir el errorstrictNullChecks
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 TypeError
errores. 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 any
tipo. 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 this
palabra clave incorrectamente o en un lugar que no esté claro this
a 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 this
palabra clave no está vinculado a ninguna instancia de Person
forma 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')
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
1617257581
¿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.
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.
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.
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.
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
1654588030
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 🌹
If you are here to read the book online get started.
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.
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.
All the amazing contributors 🌹
Share URL: https://basarat.gitbook.io/typescript/
Author: Basarat
Source Code: https://github.com/basarat/typescript-book/
License: View license
1659051180
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.json
archivo 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.json
archivo y cómo mejorar la calidad del código con las opciones strictPropertyInitialization
, useUnknownInCatchVariables
, strictFunctionTypes
, allowUnusedLabels
, allowUnreachableCode
, noPropertyAccessFromIndexSignature
, exactOptionalPropertyType
y forceConsistentCasingInFileNames
.
tsconfig.json
archivoTodas las opciones del compilador se guardan en el tsconfig.json
archivo, generado al ejecutarse tsc --init
en la terminal raíz de nuestro proyecto. En esta publicación, agregaremos al tsconfig.json
archivo 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 User
clase 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 catch
cláusula. A menudo, esto será una instancia de error y está configurado any
de manera predeterminada. Cuando la useUnknownInCatchVariable
opción del compilador se establece en verdadero, implícitamente establece cualquier variable en una catch
cláusula en unknown
lugar de any
. Considere el siguiente ejemplo:
try {
// random code...
throw 'myException';
}
catch (err) {
console.error(err.message);
}
Cuando compilamos el código anterior, con useUnknownInCatchVariables
el valor verdadero, cambia nuestro error a un unknown
tipo. 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:
unknown
a 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 if
verificació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 strictFunctionTypes
es 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 getAnimalName
y el subtipo getDogName
se pueden asignar entre sí. Los parámetros de TypeScript se comparan contravariantemente si strictFunctionTypes
se 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í, getAnimalName
es 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.
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.
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 allowUnusedLabels
opció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, curfew
es 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 allowUnreachableCode
se 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 .dot
notació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) syntax
Mientras 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 HorseRace
y 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 false
y true
valores. En test1, estamos comprobando si property
se definió; si no fuera así, registra un false
. En test2, el valor true
se registra porque lo definimos property
y lo configuramos property
en undefined
. A continuación, establezcamos la exactOptionalPropertyTypes
opció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 property
de undefined
. If property
no está anotado explícitamente en un tipo de undefined
first. Para solucionar esto, podemos anotar el property
con 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 false
y true
valores. TypeScript se da cuenta de estas dos formas diferentes de tener una propiedad indefinida cuando exactOptionalPropertyTypes
está 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 forceConsistentCasingInFileNames
la 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 StringValidator
archivo en el código anterior. Si forceConsistentCasingInFileNames
la 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.
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
1617255938
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.
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:
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:
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
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