Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

__extends继承Array时,不符合预期

Abierto
#286 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
38/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
typescript
Área
tooling

Línea de trabajo

Comienza con el helper __extends mostrado en el issue y reproduce el ejemplo de la subclase de Array. Compara su comportamiento con el enfoque _wrapNativeSuper(Array) de Babel y verifica después que la subclase conserve el comportamiento esperado de toString y width tras la compilación.

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

Descripción

question

源码:

class B extends Array{
    get width(): number {
        return 20;
    }
    toString(): string {
        return "class B";
    }
}


const b1 = new B();
b1.push("kkkkk")
console.log(b1.toString());
console.log(b1.width);
//class B
//20

转译代码

(function(){
    "use strict";

    var __extends = (this && this.__extends) || (function () {
        var extendStatics = function (d, b) {
            extendStatics = Object.setPrototypeOf ||
                ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
                function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
            return extendStatics(d, b);
        };
        return function (d, b) {
            if (typeof b !== "function" && b !== null)
                throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
            extendStatics(d, b);
            function __() { this.constructor = d; }
            d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
    })();
    var B = /** @class */ (function (_super) {
        __extends(B, _super);
        function B() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        Object.defineProperty(B.prototype, "width", {
            get: function () {
                return 20;
            },
            enumerable: false,
            configurable: true
        });
        B.prototype.toString = function () {
            return "class B";
        };
        return B;
    }(Array));

    var b1 = new B();

    b1.push("kkkkk")
    console.log(b1.toString());
    console.log(b1.width);

})();
// kkkkk
// undefined


b1.toString()走了 原生 Array 的 toString,原型链已经乱了。

对照babel的转译代码,得到的解决方案



// babel   _wrapNativeSuper方法
 // }(Array));
    }(_wrapNativeSuper(Array)));

现在,他可以正常的工作了。

Lenguaje dominante
TypeScript
Estrellas
1.3k
Forks
146
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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.

Más de microsoft/tslib

Todos los issues de microsoft/tslib

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.