microsoft / microsoft/TypeScript
Error span incorrect when `this` constraint on member function fails
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 Search Terms
- error span
this: never- this chain
- builder pattern
🕗 Version & Regression Information
- This is the behavior in every version I tried (including the latest 5.7.2)
⏯ Playground Link
💻 Code
/**
* Member function based case
*/
class FunctionBasedBuilder<Step extends number=1> {
step1(this: Step extends 1 ? this : never): FunctionBasedBuilder<2> {
return this as any;
}
step2(this: Step extends 2 ? this : never): FunctionBasedBuilder<3> {
return this as any;
}
// skip step 3 explicitly to demonstrate the error
step4(this: Step extends 4 ? this : never): FunctionBasedBuilder<5> {
return this as any;
}
}
/**
* Member variable based case
*/
class VariableBasedBuilder<Step extends number=1> {
step1: (Step extends 1 ? () => VariableBasedBuilder<2> : never) = (() => {
return this as any;
}) as any;
step2: (Step extends 2 ? () => VariableBasedBuilder<3> : never) = (() => {
return this as any;
}) as any;
// skip step 3 explicitly to demonstrate the error
step4: (Step extends 4 ? () => VariableBasedBuilder<5> : never) = (() => {
return this as any;
}) as any;
}
const funcBuilder = new FunctionBasedBuilder();
// all of `foo.step1().step2()` turns into an unhelpful error message
funcBuilder.step1().step2().step4();
const varBuilder = new VariableBasedBuilder();
// the error properly appears only on step 4
varBuilder.step1().step2().step4();
🙁 Actual behavior
In the function case, the entire span from foo.step1().step2() gets marked as an error instead of only step4() which is what actually caused the error
🙂 Expected behavior
Just like in the member variable case, it would be better if the error was shown on step4()
Additional information about the issue
I think this ends up being equivalent to #28159 so I'm not sure it can be solved without introducing the "curse" mentioned in #60140
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Abre el TypeScript Playground enlazado y compara los casos de builder basados en funciones y basados en variables, centrándote en el intervalo de diagnóstico de la llamada final a step4. Revisa la posible relación con los issues #28159 y #60140. Se considera completado cuando el caso basado en funciones resalta únicamente step4(), igual que el caso basado en variables, sin introducir una regresión en el error reportado.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 30/100