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);
}
你可以决定是否保留你的界面。
