私の企業環境では、多くの JavaScript を使用しています。このすべてのスクリプトの管理を簡素化し、名前の競合を回避するために、名前空間に JavaScript の命名規則を採用しました。これは基本的に次のとおりです。
CompanyName.ProjectName.Area.XYZ.js
名前空間を作成するために、次のパターンを使用しています。
var Company;
(function (Company) {
(function (Project) {
(function (Area) {
(function (XYZ) {
function function1(args) {
},
function function2(args) {
}
})(Area.XYZ|| (Area.XYZ = {}));
})(Project.Area || (Project.Area = {}));
var Area = Project.Area;
})(Company.Project || (Company.Project = {}));
var Project = Company.Project;
})(Company || (Company = {}));
これは問題なく動作します (実際、これは TypeScript スクリプトの出力です)。
ただし、Microsoft Ajax 名前空間関数を使用するスクリプトもいくつかあります。これは、制御不能なアプリケーション (javascript プラグイン) で必要になるためです。
私はこの宣言を使用します:
Type.registerNamespace('CompanyName.ProjectName.Area');
CompanyName.ProjectName.Area.ABC = function() {
}
CompanyName.ProjectName.Area.ABC.prototype = {
function1 : function (args) {
},
function2 : function (args) {
}
}
しかし、への呼び出しType.registerNamespace
はエラーをスローします:
Sys.InvalidOperationException: オブジェクトCompanyは既に存在し、名前空間ではありません
どうすれば両方の世界を適切に組み合わせることができますか? 問題を解決して警告を消すにはどうすればよいですか?
アプリケーションによって動的に生成されるため、スクリプトを含める順序を制御できません。
コード全体を Microsoft のパターンに移行したくありません。これは非常に役に立たず、読みにくいからです。typescript に移行すると、名前空間の出力を制御することさえできなくなります。
また、Ajax の名前空間を除外する別の名前空間を導入したくありません。チーム全体に混乱をもたらすからです。