Búsqueda de sitios web

javascript - compilación TS - "noImplicitAny" no funciona


Tengo el código

let z;
z = 50;
z = 'z';

y mi tsconfig.json es:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "sourceMap": false,
    "noEmitOnError": true,
    "strict": true,
    "noImplicitAny": true
  }
}

¿Pero qué demonios es eso de que no hay excepciones al compilar a JS?

Saludos cordiales, Crova

Respuesta #1

Porque z nunca se escribe como any. El tipo de z simplemente se infiere en función de lo que le asignes.

De las notas de la versión:

Con TypeScript 2.1, en lugar de simplemente elegir any, TypeScript inferirá tipos basándose en lo que termines asignando más adelante.

Ejemplo:

let x;

// You can still assign anything you want to 'x'.
x = () => 42;

// After that last assignment, TypeScript 2.1 knows that 'x' has type '() => number'.
let y = x();

// Thanks to that, it will now tell you that you can't add a number to a function!
console.log(x + y);
//          ~~~~~
// Error! Operator '+' cannot be applied to types '() => number' and 'number'.

// TypeScript still allows you to assign anything you want to 'x'.
x = "Hello world!";

// But now it also knows that 'x' is a 'string'!
x.toLowerCase();

Así que en tu caso:

let z;
z = 50;
let y = z * 10; // `z` is number here. No error
z = 'z';
z.replace("z", "")// `z` is string here. No error

Respuesta #2

noImplicitAny literalmente significa:

Generar un error si TypeScript usa 'any' siempre que no pueda inferir un tipo

En tu caso anterior, en cualquier punto de tu código, el compilador puede inferir fácilmente cuál es el tipo de z. Y por lo tanto, puede verificar si los métodos/propiedades apropiados que estás llamando en z están permitidos o no.

Artículos relacionados