Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

__extends继承Array时,不符合预期

Aperta
#286 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
typescript
Ambito
tooling

Direzione di ricerca

Inizia con l’helper __extends mostrato nell’issue e riproduci l’esempio della sottoclasse di Array. Confronta il suo comportamento con l’approccio _wrapNativeSuper(Array) di Babel, quindi verifica che la sottoclasse mantenga il comportamento previsto di toString e width dopo la compilazione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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)));

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

Lingua principale
TypeScript
Stelle
1.3k
Fork
146
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/tslib

Tutte le issue di microsoft/tslib

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.