javascript - ESLint se queja de que la declaración de tipo de TypeScript usa el tipo antes de que se declarara
Estoy creando un constructor que tiene tipos, la forma en que declaro el tipo es:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
Al ejecutar ESLint se queja diciendo que: "BuilderInteface" se usó antes de que se definiera (no-use-before-define). Lo cual es normal ya que necesito afirmar que cada función de argumento devuelve un constructor del mismo tipo.
¿De qué maneras puedo declarar esto sin romper la regla de eslint? ¿Debería ignorar la regla directamente? ¿Por qué?
Respuesta #1
ESLint tiene (bastante) razón, porque técnicamente no has declarado el tipo y lo estás usando. Los tipos recursivos son bastante difíciles de manejar. Intenta usar TSLint para ver si obtienes un mejor resultado, ya que entiende TypeScript mejor.
El equipo de TypeScript es bastante bueno con los tipos recursivos, así que es un tipo válido.
¡Desactiva la regla o crea una excepción para que las herramientas te permitan continuar con tu trabajo!
Respuesta #2
Es porque los tipos, a diferencia de las interfaces, no son autorreferenciales. Debes descomponer tu tipo para evitar la autorreferencia o usar interfaces.
P.D. Lo anterior es en teoría... Por alguna razón, tu tipo funciona para mí (sin tslint, solo ts). Supongo que las nuevas versiones de TS manejan esto bien. Mira esto: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. Acabo de darme cuenta de que estabas hablando de JSLint, no de TSLint. JSLint, por supuesto, no es una buena herramienta para revisar código TS. En su lugar, prueba TSLint.