Проблема с машинописным шрифтом при использовании «this» внутри конструктора класса для метода экземпляра - PullRequest
0 голосов
/ 22 декабря 2018

У меня очень простой вариант использования в TypeScript: класс, с конструктором и методом экземпляра.

Я хочу вызвать этот метод экземпляра из конструктора, но использование «this» разрешается неправильно.

Как правильно создать класс с методами экземпляра и вызывать их из конструктора?

У меня есть модуль UMD (определенный в моем tsconfig как тип модуля для компиляции как).

У меня есть следующий код:

export namespace TestNS {
    export class TestClass {
        // Fields
        testValue: string;

        constructor(val: string) {
            this.testValue = val;
            this.privateMethod();
        }

        private privateMethod() {
            console.log("private instance method");
        }
    }//TestClass class
}

И он компилируется в:

(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var TestNS;
    (function (TestNS) {
        var TestClass = /** @class */ (function () {
            function TestClass(val) {
                this.testValue = val;
                this.privateMethod();
            }
            TestClass.prototype.privateMethod = function () {
                console.log("private instance method");
            };
            return TestClass;
        }()); //TestClass class
        TestNS.TestClass = TestClass;
    })(TestNS = exports.TestNS || (exports.TestNS = {}));
});
//# sourceMappingURL=Test.js.map

Я вызываю это с помощью:

var ex = new TestNS.TestClass("test");

При вызове я получаю сообщение об ошибке, что privateMethod не может быть найден.При отладке необработанного js-кода в браузере this в конструкторе класса, похоже, ссылается на объект пространства имен «TestNS», а НЕ на мой экземпляр TestClass, который я ожидаю.С чего бы это?Это кажется очевидной проблемой, если я не могу использовать пространство имен И использовать члены экземпляра класса.

Что я здесь не так делаю?(Я хочу применить такое пространство имен для организации объектов и т.п. для более крупного проекта позже)

Редактировать: чтобы уточнить, как загружается этот код, я предоставлю эти подробности.

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": "./js",
    "target": "es5",
    "sourceMap": true,
    "typeRoots" : ["./js/lib/@types"],
    "module": "UMD"
  },
  "exclude": [
    "node_modules"
  ]
}

index.html

<!doctype html>
<html>
  <head>
    <title>Test</title>
    <script src="require.js"></script>
    <!-- Data main attribute avoided due to some environment constraints (ie: a CMS) -->
    <script src="main.js"></script>
  </head>
  <body>
    <p>Example Text</p>
  </body>
</html>

main.js

requirejs.config({
    baseUrl: "js",
    map: {
        '*': {
            'Test': 'modules/Test',
        }
    }
});

requirejs(["Test"],function(TestNS) {
    var t = new TestNS.TestClass("value");
}

1 Ответ

0 голосов
/ 22 декабря 2018

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

var ex = new TestNS.TestClass("test");

Произойдет ошибка, если ваш предыдущий код не загружен, либодобавление тега сценария перед зависимым кодом или путем импорта модуля ...

import { TestNS } from './test.js'

Я предполагаю, что это недостающий фрагмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...