eslint - Typescript evitar inferir tipos excepto en la declaración de la variable
Hay algunas preguntas sobre los tipos implícitos any en Typescript, pero ninguna que haya encontrado responde a mi pregunta.
Di que tengo esto:
let thing;
thing = 'someValue';
thing = 'someOtherValue';
La variable thing ahora tendrá el tipo any.
¿Cómo puedo prevenir esta situación en la que una variable se declara sin una anotación de tipo Y sin asignarle inmediatamente un valor con un tipo concreto? Estoy usando ESLint y encontré la regla @typescript-eslint/no-unsafe-assignment, pero eso no cubre este caso.
POR FAVOR TENGA EN CUENTA que el duplicado sugerido realmente no responde a mi pregunta. Ya tengo strict habilitado en las opciones del compilador de TS, lo que hace que noImplicitAny también esté habilitado, sin embargo, noImplicitAny no hace lo suficiente para mí.
Lo que quiero es que no se me permita crear una variable del tipo any excepto si explícitamente se anota el tipo como any. Es muy inconveniente que una variable creada cerca del principio de un bloque pueda tener su tipo inferido muchas líneas más abajo Y en múltiples lugares, lo que significa que mi IDE no puede decirme el tipo hasta después de que haya usado la variable. Prefiero mucho más que mis tipos deban ser declarados en el momento en que creo la variable.
Ejemplos:
// Good
let thing: string;
...
thing = 'someValue';
// Good
let thing = 'someValue';
// Good
let thing = SomeFunctionWithAnnotatedReturnType();
// Bad
// This is what I want to prevent
let thing;
...
thing = '123';
...
thing = 123;
Respuesta #1
Después de discusiones entre muchas personas y mucho buscar en Google, finalmente propuse una regla de ESLint para Typescript. Para mi gran sorpresa, lo que quiero ya es posible con la siguiente regla de ESLint, que se ve funcionando aquí:
"no-restricted-syntax": [
"error",
{
"selector": "VariableDeclaration[kind = 'let'] > VariableDeclarator[init = null]:not([id.typeAnnotation])",
"message": "Type must be inferred at variable declaration"
}
]
No sabía que eso era posible y abre muchas más posibilidades.
Respuesta #2
No puedo dejar un comentario ya que no tengo suficiente reputación, pero encuentro que tu pregunta no tiene mucho sentido. ¿No quieres anotar un tipo o darle un valor mientras al mismo tiempo no permites que tenga el tipo any? ¿Qué tipo exactamente quieres que tenga si no das ninguna indicación de un tipo?
Si quieres que pueda tener algunos tipos específicos más adelante en tu código, entonces puedes anotar muchos tipos para una variable.
let thing: string | number
De esta manera, TypeScript permitirá que thing sea una cadena o un número, pero nada más.
