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
}],

