私が見つけた例 here と here はmodule()を使用するように言っています。しかし、コンパイルすると「警告TS7021: 'module(...)'は推奨されません。代わりに 'require(...)'を使用してください」というメッセージが表示されます。
それで、いくつかの基本的な質問:
Update:以下は、TSCコンパイルエラーを示しています。
///<reference path='../../libs/ExtJS-4.2.0.d.ts' />
///<reference path='../../libs/require.d.ts' />
import fdm = require("./file-definitions");
require(["../../scripts/ribbon"], function () {
export module Menu {
export class MainMenu {
私は、basaratの答えに対するDavidの回答(モジュールとクラスに関して)にコメントしたでしょうが、評判はありません。私はこの質問が古いことを知っていますが、他の場所で答えを見つけませんでした。
私はbasaratのビデオを他のリソースと組み合わせて使用し、David Thielenが必要とするクラスを見つけ出すことに成功しました。 tsソースファイルのエントリはなくなりましたが、AMD依存関係とインポートステートメントはあります。 EclipseでpalantirのTSプラグインを使用すると、コード補完と使用法から定義にジャンプする機能は、AMD依存関係とインポートステートメントだけで機能します。ヘッダーファイルは、展開とは関係なく、TSコンパイラでのみ使用されるため、ステートメントが必要です。また、.tsファイル拡張子は参照ステートメントに使用されますが、AMDおよびインポートステートメントには使用されないことに注意してください。
Utils.tsには次のものがあります。
///<reference path="headers/require.d.ts" />
export function getTime(){
var now = new Date();
return now.getHours()+":"+now.getMinutes()+':'+now.getSeconds();
}
OntologyRenderScalerには次のものがあります。
///<reference path="headers/require.d.ts" />
///<reference path="headers/d3.d.ts" />
///<reference path="headers/jquery.d.ts" />
///<AMD-dependency path="Utils" />
import Utils = require('./Utils');
export class OntologyRenderScaler {
...
Utils.getTime();
...
}
OntologyMappingOverview.tsには次のものがあります。
///<reference path="headers/require.d.ts" />
///<reference path="headers/d3.d.ts" />
///<reference path="headers/jquery.d.ts" />
///<AMD-dependency path="Utils" />
///<AMD-dependency path="OntologyGraph" />
///<AMD-dependency path="OntologyFilterSliders" />
///<AMD-dependency path="FetchFromApi" />
///<AMD-dependency path="OntologyRenderScaler" />
///<AMD-dependency path="GraphView" />
///<AMD-dependency path="JQueryExtension" />
import Utils = require('./Utils');
import OntologyGraph = require('./OntologyGraph');
import OntologyRenderScaler = require('./OntologyRenderScaler');
import OntologyFilterSliders = require('./OntologyFilterSliders');
import GraphView = require('./GraphView');
export class OntologyMappingOverview extends GraphView.BaseGraphView implements GraphView.GraphView {
ontologyGraph: OntologyGraph.OntologyGraph;
renderScaler: OntologyRenderScaler.OntologyRenderScaler;
filterSliders: OntologyFilterSliders.MappingRangeSliders;
...
this.renderScaler = new OntologyRenderScaler.OntologyRenderScaler(this.vis);
...
}
上記のcodeBeltのように動作させることはできませんでしたが、彼のブログで行ったやり取りでは、(ファイルの下部にMyClassをエクスポートして)彼のアプローチを動作させると、インポートされた識別子をクラス名で2倍にする必要があります。定義されている名前空間(暗黙的な外部モジュール、つまりTypeScriptファイル名)ではなく、目的のクラスをエクスポートすると思います。
ために :
TypeScriptとrequireJSを使用する場合、requireJSが2番目のファイルをロードし、最初のファイルのクラスを与える別の.tsファイルから1つの.tsファイルのクラスにアクセスするにはどうすればよいですか?最上部のdefine()が2番目のtsファイルをロードし、最後にビルドしたオブジェクトを返す2つの.tsファイルで標準のrequireJSアプローチを行う方法はありますか?
単に:
// from file a.ts
export class Foo{
}
// from file b.ts
// import
import aFile = require('a')
// use:
var bar = new aFile.Foo();
--module AMD
フラグを使用して両方のファイルをコンパイルします。
ために :
質問#2と同じソート。 Javaスクリプトファイルから、タイプスクリプトファイルでdefine()コンストラクトを使用して、インスタンス化されたオブジェクトを取得できますか?
b.jsからa.tsを使用するには:
// import as a dependency:
define(["require", "exports", 'a'], function(require, exports, aFile) {
// use:
var bar = new aFile.Foo();
});
これはb.tsをコンパイルした場合に得られるものに似ています
作成するクラスの下にexportステートメントが必要です。
// Base.ts
class Base {
constructor() {
}
public createChildren():void {
}
}
export = Base;
次に、別のクラスにインポートして使用するには、次のようにします。
// TestApp.ts
import Base = require("view/Base");
class TestApp extends Base {
private _title:string = 'TypeScript AMD Boilerplate';
constructor() {
super();
}
public createChildren():void {
}
}
export = TestApp;
サンプルコードは http://www.codebelt.com/TypeScript/typescript-internal-and-external-modules/ で確認できます。
私はTypeScriptを使って、既存のjavascript/requirejsプロジェクトに統合しようとしています。セットアップとして、v 0.9.1.1用のTypeScriptを備えたVisual Studio 2013があります。 TypeScriptは、(Visual Studioで)モジュールをAMD形式でコンパイルするように構成されています。
これは私のために仕事を見つけたものです(もちろんより良い方法があるかもしれません)
補足説明として、TypeScriptに不可欠な私の見解であり、頭痛の種であるため、この例では、インターフェイスを使用するクラスをエクスポートする2つの方法を示します。インターフェイスの問題は、タイプチェックに使用されるが、実際の出力が生成されないこと(生成された.jsファイルが空)であり、「プライベートクラスのエクスポート」タイプの問題を引き起こすことです。インターフェイスを実装するクラスをエクスポートする:
最初のオプションの方が優れているようです。インスタンス化関数を呼び出す必要はなく、さらに、型付きクラスを使用して作業する必要があります。欠点は、[空の]インターフェースのjavascriptファイルがブラウザーに移動することです(ただし、それはとにかくそこにキャッシュされ、多分あなたは縮小を使用しているかもしれません。
次のコードブロックには、Requires(AMD)でロードされる2つのTypeScriptモジュールがあります。LoggerとImportです。
ILogger.tsファイル
interface ILogger {
log(what: string): void;
}
Logger.tsファイル
///<reference path="./ILogger.ts"/>
//this dependency required, otherwise compiler complaints of private type being exported
///<AMD-dependency path="./ILogger"/>
class Logger implements ILogger {
formatOutput = function (text) {
return new Date() + '.' + new Date().getMilliseconds() + ': ' + text;
};
log = function (what) {
try {
window.console.log(this.formatOutput(what));
} catch (e) {
;
}
};
}
//this approach requires the AMD-dependency above for the interafce
var exportLogger: ILogger = new Logger();
export = exportLogger;
別のtsファイル(Import.ts)でLogger.tsを使用する
///<reference path="../../../ext/definitions/require.d.ts"/>
///<AMD-dependency path="Shared/Logger"/>
///<AMD-dependency path="./IImport"/>
class _Import implements IImport{
ko: any;
loggerClass: ILogger;
constructor() {
this.ko = require('knockout');//require coming from require.d.ts (in external_references.ts)
this.loggerClass = require('Shared/Logger');
}
init(vm: any) {
this.loggerClass.log('UMF import instantiated...');
}
}
////Alternative Approach:
////this approach does not require adding ///<AMD-dependency path="./IImport"/>
////this can be consumed as <imported_module_name>.instantiate().init();
//export function instantiate() {
// var r : any = new _Import();// :any required to get around the private type export error
// return r;
//}
//this module can be consumed as <imported_module_name>.init();
var exported: IImport = new _Import();
export = exported;
IImport.tsファイル
interface IImport {
init(vm: any): void;
}
インポートモジュールをjavascriptから直接使用するには、次のようなものを使用してください(私はこれを試したことはありませんが、動作するはずです)
define (['Import'], function (import)
{
//approach 1
import.init();
////approach 2
//import.instantiate().init();
});