microsoft / microsoft/TypeScript

Function expressions in a property assignment of a prototype object should be methods, not nested classes

Abierto
#37,720 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Domain: Binder
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

/** @class */
module.exports.C = function() {
  this.x = 1
}
module.exports.C.prototype = {
  m1() {
    this.a = 1
  },
  m2: function() {
    this.b = 2
  }
}
var c = new module.exports.C()
c.a
c.b

Expected behavior:
c.a and c.b both work.

Actual behavior:
Only c.a works; c.b says that 'd' does not exist on type 'C'. There's also an error on this.b = 2 when noImplicitThis: true.

bindThisPropertyAssignment needs to understand that function expressions might be part of a property assignment in an object literal. The code to handle this will probably look like this:

                    // For `{ x: function() }` should modify the object literal's members, not behave like a fresh class (as long as it doesn't have @class on it)
                    if (isPropertyAssignment(thisContainer.parent)) {
                        // wow I hope those parent pointers are set!
                        const containingClass = thisContainer.parent.parent;
                        const symbolTable = containingClass.symbol.members!;
                        if (hasDynamicName(node)) {
                            bindDynamicallyNamedThisPropertyAssignment(node, containingClass.symbol);
                        }
                        else {
                            declareSymbol(symbolTable, containingClass.symbol, node, SymbolFlags.Property | SymbolFlags.Assignment, SymbolFlags.None, /*isReplaceableByMethod*/ true);
                        }
                        break;
                    }

I expect this to break a lot of tests, but it didn't. However, I haven't tried it on the user tests yet.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con la reproducción del issue e inspecciona bindThisPropertyAssignment, especialmente cómo se manejan las expresiones de función dentro de asignaciones de propiedades de objetos prototype. Verifica el comportamiento con el ejemplo mostrado bajo noImplicitThis, incluido si tanto c.a como c.b funcionan y si el diagnóstico informado ha desaparecido.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, typescript
Área
compilers
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.