web-dev-qa-db-ja.com

タイプスクリプトエラーランタイムエラー:拡張時に未定義のプロパティ 'prototype'を読み取れません

そのため、コンソールに上記のエラーが表示されます。 _super(生成された__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...は必要ないはずです(必要ではありません)が、それが役立ったかどうかを確認するために追加しました(役に立たなかった)。

ファイルはBundleConfigを介して正しい順序(Test.ts、次にTest2.ts)で含まれます(最適化の有無にかかわらず実行しても効果はありません)。

私は恐らく巨大な初心者ですが、私が台無しにしたことを少しでも手がかりにしています。私がオンラインで発見したこの問題の他のすべての例は、コマンドラインコンパイラを使用して複数のTypeScriptファイルを1つのファイルに結合する人々からのものです。私はそのためにバンドラーを使用していますが、それらを結合しなくても、まったく同じ問題が発生します。

私を助けてください、私は私の知恵の終わりにいます!

要求に応じて、コンパイル済みの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
34
Maverick

これが起こっている考えられる理由:

  1. BundleConfigが正しい順序でファイルを連結していることを4回確認します。これは間違いなくそのエラーの最も一般的な原因です。
  2. Test.tsにトップレベルのexportディレクティブがないことを確認します。これにより、ファイルが外部モジュールになり、Test1が表示されなくなります。

それに失敗したら、発行されたJavaScriptを質問に投稿して、問題の原因を診断できるようにしてください。

25
Ryan Cavanaugh

今日、このエラーが発生しました。 OPシナリオが何であるかはわかりませんが、私のチームの場合は次のとおりです。

  1. TypeScript v1.8.10
  2. 連結、ソースマップ、最適化/修正なしのWebpackベースの開発ビルド
  3. Angular 2依存性注入
  4. 同じファイルで定義された基本クラスと派生クラス(たとえば、dependencies.ts
  5. 定義された基本クラスafter派生クラス
  6. コンパイルエラーも警告もありません
  7. Uncaught TypeError: Cannot read property 'prototype' of undefinedを示すコンソールログ
  8. 別のファイルの別のクラスの最後の行にある内部__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

基底クラスbefore派生クラスを定義することで問題が解決しました。すばやく検索して読んだ後、これは既知の(および未解決の)TypeScriptの問題に関連しているようです。 #21 および #1842

HTH

18
superjos

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>
3
iberodev

私は同じ問題を抱えていましたが、export defaultステートメント。修正するには、それらを削除して、必要なアイテムを別の方法でインポートしました。

[〜#〜] before [〜#〜]

A.ts

export default MyClass;

class MyClass { ... }

B.ts

import MyClass from "./A";

class MyClass2 extends MyClass { ... }

[〜#〜] after [〜#〜]

A.ts

export class MyClass { ... }

B.ts

import { MyClass } from "./A";

class MyClass2 extends MyClass { ... }
2
Jenny O'Reilly

私の場合、この問題をどのように解決したかをここに残します:TSファイルの上部にある参照を逃しましたが、ビルドにはまったく問題ありませんでしたが、実行時に同じエラーが発生しました。オプションと思われる参照を追加すると、ランタイムの問題が解決しました。

1
bviale