Подтвердить что ты не робот

Typescript ошибка времени выполнения ошибки: невозможно прочитать свойство 'prototype' of undefined при расширении

Итак, я получаю вышеуказанную ошибку в консоли. Это вызвано тем, что _super является undefined, когда он передал __extends (в сгенерированном .js).

Вот несколько тестовых кодов, которые можно использовать для воспроизведения ошибки:

//This is the entirety of the file Test.ts
module Test {
    export class Test1 {
        public Name: string;
        public Number: number;

        constructor() {

        }
    }
}

Затем в отдельном файле у меня есть класс, который наследуется от этого:

/// <reference path="Test.ts" />
module Test {
    export class Test2 extends Test1 {
        constructor() {
            super();
        }
    }
}

<reference path... не требуется (и нет), но я добавил его, чтобы увидеть, помогло ли оно (это не так).

Файлы включены в правильный порядок (Test.ts then Test2.ts) через BundleConfig (работа с оптимизацией или без нее не имеет никакого эффекта).

Я, вероятно, гигантский нооб, но я не знаю, что я испортил. Все другие случаи этой проблемы, которые я нашел в Интернете, - это люди, использующие компилятор командной строки для объединения нескольких файлов Typescript в один файл. Я использую bundler для этого, но даже когда я их не совмещаю, я получаю ту же самую проблему.

Пожалуйста, помогите мне, я нахожусь на своем пути!

В соответствии с запросом здесь скомпилированный javascript: Test.js:

//This is the entirety of the file Test.ts
var Test;
(function (Test) {
    var Test1 = (function () {
        function Test1() {
        }
        return Test1;
    })();
    Test.Test1 = Test1;
})(Test || (Test = {}));
//# sourceMappingURL=Test.js.map

Test2.js:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
/// <reference path="Test.ts" />
var Test;
(function (Test) {
    var Test2 = (function (_super) {
        __extends(Test2, _super);
        function Test2() {
            _super.call(this);
        }
        return Test2;
    })(Test.Test1);
    Test.Test2 = Test2;
})(Test || (Test = {}));
//# sourceMappingURL=Test2.js.map
4b9b3361

Ответ 1

Возможные причины этого:

  • Четырежды проверьте, что BundleConfig объединяет файлы в правильном порядке. Это, безусловно, самая распространенная причина этой ошибки.
  • Убедитесь, что у вас нет директив export верхнего уровня в Test.ts. Это приведет к тому, что файл станет внешним модулем, а Test1 больше не будет отображаться.

В противном случае вы должны опубликовать испущенный JavaScript на вопрос, чтобы мы могли диагностировать причину проблемы.

Ответ 2

Повлиял на эту ошибку сегодня. Не уверен, что такое сценарий OP, но в моем случае у нас было:

  • TypeScript v1.8.10
  • Разработка на основе Webpack с конкатенацией, исходными картами, оптимизацией/углификацией
  • Angular 2 инъекции зависимостей
  • Оба базовых и производных класса, определенные в одном файле (например, dependencies.ts)
  • Базовый класс определяется после производного класса
  • Ошибок компиляции и предупреждений
  • Журнал консоли, показывающий Uncaught TypeError: Cannot read property 'prototype' of undefined
  • Стек вызовов, указывающий на внутреннюю функцию __extends в последней строке другого класса, в другом файле (например, client.ts), импортируя их как зависимости

В коде:

// dependencies.ts

import { Injectable } from 'angular2/core';

@Injectable()
export class LocalStorageService extends BaseStorageService {
  constructor() {
    super(localStorage);
  }
}

class BaseStorageService {
  constructor(private storage: Storage) {}
  // ...
}

и

// client.ts

import { Injectable } from 'angular2/core';
import { LocalStorageService } from './dependencies';

@Injectable()
export class AuthStorageService {

  constructor(private permanentStorage: LocalStorageService) { }
  // ...

} // <-- call stack pointed here with inner '__extends' function

Проблема решена путем определения базового класса до. После быстрого поиска и чтения это похоже на известные (и нерешенные?) Проблемы TypeScript, например. # 21 и # 1842.

НТН

Ответ 3

Порядок выполнения скриптов в вашем HTML файле.

Скажем, у вас есть TypeScript файл A.ts, который определяет абстрактный класс и файл B.ts с классом, который расширяет абстрактный класс в A.ts

экспорт абстрактного класса ShipmentsListScope реализует IShipmentsListScope {

A.ts:

module app.example{
  "use strict";

  interface IMyInterface{
    // ..
  } 
  export abstract class MyAbstract implements IMyInterface{
    // ..
  }
}

B.ts

module app.example{
    "use strict";

  class MyChildClass extends MyAbstract {
    // ...
  }
}

то в вашем HTML вы должны убедиться, что порядок скриптов правильный после создания javascript:

<script src="/app/example/A.js"></script> <!-- A.js BEFORE -->
<script src="/app/example/B.js"></script>

Ответ 4

У меня была та же проблема, и она была вызвана операторами export default. Чтобы исправить это, я просто удалил их и импортировал нужные элементы другим способом:

перед

A.ts

export default MyClass;

class MyClass { ... }

B.ts

import MyClass from "./A";

class MyClass2 extends MyClass { ... }

после

A.ts

export class MyClass { ... }

B.ts

import { MyClass } from "./A";

class MyClass2 extends MyClass { ... }

Ответ 5

Просто оставив здесь, как я решил эту проблему для своего случая: я пропустил ссылку в верхней части файла TS, и это было полностью нормально для сборки, тогда как у меня была такая же ошибка во время выполнения. Добавление ссылки, которая, по-видимому, была опциональной, позволила решить мою проблему во время выполнения.