在新的打字稿文件中使用现有的AMD js模块(0.9)

时间:2013-06-21 20:25:38

标签: javascript typescript amd

我正在尝试使用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;
}

最后,我创建了一个全新的TypeScript类(PropertyBag.ts),我希望使用我的旧activityProperty AMD:

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类的新实例。我错过了一些微不足道的东西吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您的代码将无法编译为可直接与外部AMD模块一起使用的JavaScript,因为您的AMD模块会导出类本身,而不是具有指向您的类的IActivityProperty属性的命名空间。

您需要以这种方式定义系统:

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>

答案 1 :(得分:1)

目前您的声明只有一个界面。将其声明为一个类,以显示它可以被新建和/或扩展...

declare class ActivityProperty {
    constructor(public key: string, public value: string);
}

您可以决定是否保留您的界面。