Форум программистов, компьютерный форум, киберфорум
Наши страницы
TypeScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
kotelok
105 / 105 / 63
Регистрация: 08.08.2014
Сообщений: 328
1

Создать экземпляр по полному имени класса

18.12.2018, 13:34. Просмотров 1528. Ответов 1
Метки нет (Все метки)

Подскажите, как обратиться к классу по его полному имени в TypeScript. В самом простом случае, есть два класса:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace API {
    export class SomeUnit {
 
    }
}
 
namespace UI {
    export class SomeUnit {
        
    }
}
И далее, где-то в другом классе мне нужно создать экземпляры обоих этих классов по их полным (включая пространство имён) именам:
C#
1
2
var apiUnit = new API.SomeUnit();
var uiUnit = new UI.SomeUnit();
Вероятно, у меня что-то настроено не так (Angular6) или я недопонимаю принцип экспортов/импортов в TS, но не получается.

Более того, актуально это не только в случае одноимённых классов из разных пространств имён, но и просто когда в одном блоке кода пересекаются сущности из разных слоёв логики и когда полное имя класса заметно упрощает чтение кода без необходимости лезть в комментарии или выводить суть объекта из контекста или его сборки/файла. Т.е. если где-то в коде есть:
C#
1
var invoice = new Invoice();
То сразу и не поймёшь, что это за класс, но если оно записано с полным именем, то сразу всё понятно и код читается намного легче:
C#
1
2
var invoice = new API.DTO.Invoice();
var invoice = new UI.Model.Invoice();
Возможно ли это как-то на TS похожим образом использовать, не вписывая весь аналог пространства имён в виде префикса имени самого класса?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2018, 13:34
Ответы с готовыми решениями:

Выбрать элементы конкретной формы по имени класса
Добрый день! У меня на странице несколько форм. Для одной из них должна производиться проверка...

Как скрыть и показать все элементы по имени класса?
Практически готовое решение моего вопроса, но с id. https://jsfiddle.net/Lgf705zr/ Нужно по...

Получение объекта класса по полному имени и аргументам конструктора
Существует реализация класса для создания экземпляров объектов и пока что в нём реализован (не до...

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one...

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая:...

1
8Observer8
2488 / 1593 / 273
Регистрация: 05.10.2013
Сообщений: 4,946
Записей в блоге: 72
19.12.2018, 19:31 2
Лучший ответ Сообщение было отмечено 8Observer8 как решение

Решение

Я добавил ключевое слово export перед namespace:
Javascript
1
export namespace API
В файле, где используем классы, добавил import пространств имён:
Javascript
1
2
import { API } from "./API";
import { UI } from "./UI";
Работает:
Javascript
1
2
        let apiUnit = new API.SomeUnit();
        let uiUnit = new UI.SomeUnit();
Песочница

Исходники


namespace-fullname.zip

API.ts
Javascript
1
2
3
4
5
6
7
8
9
10
export namespace API
{
    export class SomeUnit
    {
        constructor()
        {
            document.write("API.SomeUnit constructor" + "<br>");
        }
    }
}
UI.ts
Javascript
1
2
3
4
5
6
7
8
9
10
export namespace UI
{
    export class SomeUnit
    {
        constructor()
        {
            document.write("UI.SomeUnit constructor" + "<br>");
        }
    }
}
Program.ts
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { API } from "./API";
import { UI } from "./UI";
 
// Playground: https://plnkr.co/edit/hiQJeMvKRSghOWlLBTyP?p=preview
 
class Program
{
    public static Main(): void
    {
        document.write("Hello from Main" + "<br>");
 
        let apiUnit = new API.SomeUnit();
        let uiUnit = new UI.SomeUnit();
 
        document.close();
    }
}
Program.Main();
RequireConfig.ts
Javascript
1
2
3
4
5
6
7
8
requirejs.config({
    baseUrl: "."
});
 
requirejs(["Program"], (Program) =>
{
 
});
index.html
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Namespace Fullname in TypeScript</title>
    <script data-main="RequireConfig" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
</head>
 
<body>
 
</body>
 
</html>
tsconfig.json
JSON
1
2
3
4
5
6
7
8
{
    "compilerOptions": {
        "module": "amd",
        "target": "es5",
        "outDir": ".",
        "sourceMap": true
    }
}
package.json
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    "name": "namespace-fullname",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@types/requirejs": "^2.1.31"
    }
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2018, 19:31

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не...

Создать экземпляр класса по ссылке экземпляра класса
Есть класс для обработки клиентов // Абстрактный class ClientProcessing { }; Я создаю от...

Создать экземпляр класса
Доброго всем времени суток. Вопрос банальный, но из-за этого не могу разобраться. Есть класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru