我正在尝试使用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
类的新实例。我错过了一些微不足道的东西吗?
感谢您的帮助!
答案 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);
}
您可以决定是否保留您的界面。