Búsqueda de sitios web

tslint - Prohibir asignar una variable de tipo any a una variable de otro tipo en Typescript


Así que tengo este fragmento de código

let var1: any;
var1 = 'hello';
let var2: number = var1;

Por alguna razón, TypeScript NO se queja de que estoy intentando asignar una variable de tipo any a un number. ¿Alguien sabe si hay una regla de compilador o de tslint que prohíba esto? Sí, ahora sé que puedo prohibir any, pero incluso si está prohibido, el error ocurriría en la línea 1, no en la línea 3.

Ejemplo de playground de Typescript

Agregando más detalles a mi pregunta original

Mi caso específico es cuando se utiliza una biblioteca de terceros que tiene una definición como

// Definition file
export declare class StateParams {
    [key: string]: any;
}

... later on in my own code

function myFunc(theVar: StateParams) {
    // I know myParam is a number, but all typescript knows is that myParam is of type any
    let otherVar: number = theVar.myParam;
}

Entonces, incluso si tengo la regla tsLint no-any, esto no ayudará y TypeScript no se quejará, y no puedo hacer nada con StateParams ya que no puedo controlarlo

Respuesta #1

Basado en la especificación del lenguaje TypeScript bajo la sección "3.11.4 Compatibilidad de Asignación" (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.11.4):

S es asignable a un tipo T, y T es asignable desde S, si S no tiene propiedades excedentes con respecto a T (3.11.5) y se cumple una de las siguientes condiciones:

  • S y T son tipos idénticos.
  • S o T es del tipo Any.

Esto indica que cualquier tipo se puede asignar a "any" y que "any" se puede asignar a cualquier otro tipo.

La mejor práctica es no usar nunca el tipo "any" en tu código a menos que estés trasladando una base de código existente de JS a TS. En ese caso, puedes comenzar con "any" para todos los tipos y con el tiempo cambiarlos por tipos más específicos.

En caso de que tu variable tenga un tipo complejo que no pueda ser capturado con tipos simples de TS, puedes definir manualmente un tipo más específico o usar uniones para permitir múltiples tipos. Por ejemplo:

let var1: number | string;
var1 = 'hello';
let var2: number = var1;

Ahora, el código anterior lanzará correctamente un error indicando que no puedes asignar un var1 posiblemente de tipo string a var2.

Respuesta #2

Puedes usar una regla eslint @typescript-eslint/no-explicit-any para aplicar el tipo unknown en todas partes en lugar de any:

.eslintrc.json

{
...
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "rules": {
    "@typescript-eslint/no-explicit-any": ["error", {
      "fixToUnknown": true
    }],

Artículos relacionados