2013-07-26 4 views
2

Если у меня есть один файл с двумя типами в двух разных пространствах имен. Сгенерированный порядок имеет значение.Модуль ввода-вывода как пространство имен

export module Shapes { 

    export module Weird{ 
     export class weirdshape extends Normal.normalshape{ 
      public x = 3; 
     } 
    } 
    export module Normal{ 
     export class normalshape { 
      public y = 4; 
     } 
    } 
} 

Это произведет

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 __(); 
}; 
define(["require", "exports"], function(require, exports) { 
    (function (Shapes) { 
     (function (Weird) { 
      var weirdshape = (function (_super) { 
       __extends(weirdshape, _super); 
       function weirdshape() { 
        _super.apply(this, arguments); 
        this.x = 3; 
       } 
       return weirdshape; 
      })(Normal.normalshape); 
      Weird.weirdshape = weirdshape; 
     })(Shapes.Weird || (Shapes.Weird = {})); 
     var Weird = Shapes.Weird; 
     (function (Normal) { 
      var normalshape = (function() { 
       function normalshape() { 
        this.y = 4; 
       } 
       return normalshape; 
      })(); 
      Normal.normalshape = normalshape; 
     })(Shapes.Normal || (Shapes.Normal = {})); 
     var Normal = Shapes.Normal; 
    })(exports.Shapes || (exports.Shapes = {})); 
    var Shapes = exports.Shapes; 
}); 

В таком порядке это не удастся. Поскольку Shapes.Normal.normalshape еще не определен.

Есть ли способ сделать это в машинописном тексте, где модули могут использоваться как собственные пространства имен?

+1

Я считаю, машинопись старается быть как можно ближе к JavaScript, как это возможно, что означает, что код, который предполагается разбить при нормальном JavaScript (т.е. ваш код выше) будет продолжать сбой в TypeScript вместо того, чтобы TypeScript вводил поведение, отличное от JavaScript. Это действительно связано с добавлением сильной типизации и других функций ES6, но не делает никакого анализа управления потоком. –

+1

Для вашей ситуации гораздо лучше разделить два класса на отдельные модули и использовать загрузчик модулей. Модульные погрузчики придуманы именно для решения вашей проблемы. –

ответ

1

Так, если вопрос «как мне сделать этот код запуска», ответ должен это сделать:

export module Shapes { 
    export module Normal{ 
     export class normalshape { 
      public y = 4; 
     } 
    } 

    export module Weird{ 
     export class weirdshape extends Normal.normalshape{ 
      public x = 3; 
     } 
    } 
} 

Это на самом деле не является ограничением Машинопись - это ограничение JavaScript. Если вы используете что-то до его объявления, у вас возникают проблемы.

Вы можете утверждать, что TypeScript должен сортировать заказ для вас, поскольку он может выработать зависимость. На самом деле, это будет сделано, если у вас есть отдельные файлы. Например, если Normal находится в Normal.ts и Weird находится в Weird.ts, сгенерированный вывод будет правильно заказан для вас.

Полный пример:

Weird.ts

/// <reference path="Normal.ts" /> 

module Shapes { 
    export module Weird { 
     export class weirdshape extends Shapes.Normal.normalshape { 
      public x = 3; 
     } 
    } 
} 

Normal.ts

module Shapes { 
    export module Normal { 
     export class normalshape { 
      public y = 4; 
     } 
    } 
} 

app.ts

/// <reference path="Weird.ts" /> 
/// <reference path="Normal.ts" /> 

var weird = new Shapes.Weird.weirdshape(); 

Составлено с использованием --out final.js - в результате final.js:

var Shapes; 
(function (Shapes) { 
    (function (Normal) { 
     var normalshape = (function() { 
      function normalshape() { 
       this.y = 4; 
      } 
      return normalshape; 
     })(); 
     Normal.normalshape = normalshape; 
    })(Shapes.Normal || (Shapes.Normal = {})); 
    var Normal = Shapes.Normal; 
})(Shapes || (Shapes = {})); 
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 __(); 
}; 
var Shapes; 
(function (Shapes) { 
    (function (Weird) { 
     var weirdshape = (function (_super) { 
      __extends(weirdshape, _super); 
      function weirdshape() { 
       _super.apply(this, arguments); 
       this.x = 3; 
      } 
      return weirdshape; 
     })(Shapes.Normal.normalshape); 
     Weird.weirdshape = weirdshape; 
    })(Shapes.Weird || (Shapes.Weird = {})); 
    var Weird = Shapes.Weird; 
})(Shapes || (Shapes = {})); 
var weird = new Shapes.Weird.weirdshape(); 
Смежные вопросы