2

我正在尝试使用以纯 javascript 编写的现有 AMD 和使用 TypeScript v0.9 的新 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该类的新实例。我错过了一些微不足道或明显的东西吗?

感谢您的任何帮助!

4

2 回答 2

2

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

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

活动属性.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。但是,我认为您真正想要的是:

活动属性.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 回答
1

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

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

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

于 2013-06-22T00:28:34.130 回答