У меня очень простой вариант использования в 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");
}