网站搜索

javascript - 在新的 TypeScript 文件中使用现有的 AMD js 模块 (0.9)


我正在尝试在一个用纯 JavaScript 编写的现有 AMD 模块中使用一个新的 TypeScript 文件,使用 TypeScript v0.9。我已经将其简化为一个非常简单的 AMD 模块来演示问题。

首先,我现有的 AMD (activityProperty.js):

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

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

            return self;
        };

        return activityProperty;
    });

其次,我创建了 activityProperty.d.ts,并定义了现有 AMD 的接口:

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 类的新实例。我是不是漏掉了什么简单或显而易见的东西?

感谢任何和所有的帮助!

答案#1

你的代码无法编译成可以直接与外部 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>

答案#2

目前你的声明只有一个接口。将其声明为类,以显示它可以被实例化和/或扩展...

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

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

相关文章