2

TypeScript v0.9 を使用して、純粋な JavaScript で記述された既存の AMD を新しい TypeScript ファイルで使用しようとしています。問題を示すために、非常に単純な AMD に分解しました。

まず、私の既存の AMD (activityProperty.js):

define([],
    function () {
        var activityProperty = function (key, value) {
            var self = this;

            self.key = key;
            self.value = value;

            return self;
        };

        return activityProperty;
    });

次に、既存の AMD のインターフェイス定義を使用して activityProperty.d.ts を作成しました。

export interface IActivityProperty {
    key: string;
    value: string;
}

最後に、古い activityProperty AMD を使用する新しい TypeScript クラス (PropertyBag.ts) を作成しました。

import PropertyModule = require("activityProperty");

class PropertyBag {
    private properties: Array<PropertyModule.IActivityProperty>;

    constructor() {
        this.properties = new Array<PropertyModule.IActivityProperty>();

        //this is where my problem is...
        //this.properties.push(???new activityProperty()???);
    }
}

私は一生、古い AMD 定義を使用してactivityPropertyクラスの新しいインスタンスを作成する方法を理解できません。些細なことや明らかなことを見逃していますか?

助けてくれてありがとう!

4

2 に答える 2

2

AMD モジュールは、クラスを指す IActivityProperty プロパティを持つ名前空間ではなく、クラス自体をエクスポートするため、コードは外部 AMD モジュールで直接動作する JavaScript にコンパイルされません。

システムを次のように定義する必要があります。

activityProperty.d.ts:

declare module "activityProperty"
{
    class activityProperty {
        constructor(key: KeyType, value: ValueType);
        key: KeyType;
        value: ValueType;
    }

    export = activityProperty;
}

PropertyBag.ts:

/// <reference path="activityProperty.d.ts" />
import activityProperty = module("activityProperty");

this.properties = new Array<activityProperty>();
this.properties.push(new activityProperty(key, value));

これは、外部 AMD モジュールで動作する JavaScript に直接コンパイルされます。ただし、あなたが本当に欲しいのは次のとおりだと思います。

activityProperty.d.ts:

declare module "activityProperty"
{
    class activityProperty<K, T> {
        constructor(key: K, value: T);
        key: K;
        value: T;
    }

    export = activityProperty;
}

PropertyBag.ts:

/// <reference path="activityProperty.d.ts" />
import activityProperty = module("activityProperty");

var x = new activityProperty("hello", 123);   // Type inferred to be activityProperty<string, number>
于 2013-06-23T06:25:19.037 に答える