如何使用Typescript编写dojo.declare和继承的函数?
我使用的是TypeScript 0.9和Dojo 1.8 正在尝试将以下dojo代码转换为Typescript,但不是很成功。 它正在使用dojo.declare创建一个类。还使用this.inherited(参数)调用超类方法。有人能帮我把它转换成d.ts文件吗如何使用Typescript编写dojo.declare和继承的函数?,dojo,typescript,Dojo,Typescript,我使用的是TypeScript 0.9和Dojo 1.8 正在尝试将以下dojo代码转换为Typescript,但不是很成功。 它正在使用dojo.declare创建一个类。还使用this.inherited(参数)调用超类方法。有人能帮我把它转换成d.ts文件吗 // Define class A var A = declare(null, { myMethod: function(){ console.log("Hello!"); } }); // Defi
// Define class A
var A = declare(null, {
myMethod: function(){
console.log("Hello!");
}
});
// Define class B
var B = declare(A, {
myMethod: function(){
// Call A's myMethod
this.inherited(arguments); // arguments provided to A's myMethod
console.log("World!");
}
});
多重继承的一个更复杂的情况是:
define(["dojo/_base/declare",
"dijit/_Widget",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin".
"text!/some.html"],
function (dojo_declare, _Widget, _TemplateMixin, _WidgetsInTemplateMixin, template) {
var mod =
{
templateString: template,
constructor: function () {
},
postCreate: function () {
// do something here....
this.inherited(arguments);
}
};
return dojo_declare("sample", [_Widget, _TemplateMixin, _WidgetsInTemplateMixin], mod);
});
如果您试图为现有JavaScript代码创建声明文件,您可能需要如下内容:
declare class A {
myMethod(): void;
}
declare class B extends A {}
class A {
myMethod(): void {
console.log("Hello!");
}
}
class B extends A {
myMethod(): void {
super.myMethod();
console.log("World!");
}
}
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
if (name !== 'constructor') {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
}
要将该代码转换为TypeScript,您可能需要以下内容:
declare class A {
myMethod(): void;
}
declare class B extends A {}
class A {
myMethod(): void {
console.log("Hello!");
}
}
class B extends A {
myMethod(): void {
super.myMethod();
console.log("World!");
}
}
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
if (name !== 'constructor') {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
}
区别在于一个包含实现,另一个只是签名
在我自己将一些dojo代码转换为TypeScript之后,我可以告诉您,标准TypeScript类可以用dojo.declare类扩展,但不能用TypeScript类扩展dojo.declare类。Dojo做了很多只有它才知道如何处理的有趣的事情。我相信你会尽你所能地接近它。您可以在.d.ts文件中手工编写接口代码,并将类型分配给构造的实例,但您无法获得想要的位置,因为dojo继承与typescript继承不兼容。似乎要实现这一点,我们必须能够告知typescript我们所说的“扩展”是什么意思,例如,一个编译器指令,上面写着objectmodel=dojo。在dojojs
中,declare
函数是创建类的一种变通方法,因此下一个代码:
// Define class A
var A = declare(null, {
myMethod: function(){
console.log("Hello!");
}
});
// Define class B
var B = declare(A, {
myMethod: function(){
// Call A's myMethod
this.inherited(arguments); // arguments provided to A's myMethod
console.log("World!");
}
});
应等同于:
// Define class A
class A {
myMethod() {
console.log("Hello!");
}
}
// Define class B
class B extends A {
myMethod() {
// Call A's myMethod
super.myMethod(); // arguments provided to A's myMethod
console.log("World!");
}
});
对于第二个示例中显示的多重继承的情况,Typescript在本机上不支持它。这意味着您应该使用助手函数来完成此操作。例如,代码:
define(["dojo/_base/declare",
"dijit/_Widget",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin".
"text!/some.html"],
function (dojo_declare, _Widget, _TemplateMixin, _WidgetsInTemplateMixin, template) {
var mod =
{
templateString: template,
constructor: function () {
},
postCreate: function () {
// do something here....
this.inherited(arguments);
}
};
return dojo_declare("sample", [_Widget, _TemplateMixin, _WidgetsInTemplateMixin], mod);
});
你可以做:
import declare = require("dojo/_base/declare");
import _Widget = require("dijit/_Widget");
import _TemplateMixin = require("dijit/_TemplatedMixin");
import _WidgetsInTemplateMixin = require("dijit/_WidgetsInTemplateMixin");
import template = require("text!/some.html");
// Most likely you should extend _Widget since it is the one which contains
// the method `postCreate`
class Sample extends _Widget implements _TemplateMixin, _WidgetsInTemplateMixin {
templateString: string = template;
constructor() {}
postCreate() {
// do something here....
super.postCreate(arguments);
}
// here you should put the overridden methods from the `implements` statement
buildRendering: Function;
destroyRendering: Function;
getCachedTemplate: Function;
//...
}
// This line is possibly wrong
applyMixins (Sample, [_TemplateMixin, _WidgetsInTemplateMixin]);
</pre>
PD:Typescript中的
declare
关键字用于创建定义文件(*.d.ts
),而不是用于声明类。如果你想公开任何类、函数或变量,你应该在它们前面加上关键字export
嘿,我希望参加聚会不会太晚
使用dojo和typescript需要有dojo的类型定义文件,以便可以使用typescript提供的出色类型检查
要获得这些,可以使用npm安装@types/dojo
参考文献
有了它,您将能够访问dojo类型
import * as dojoDeclare from "dojo/_base/declare";
然后您可以继续使用declare
let dojoBootstrapProgressBar = dojoDeclare("BootstrapProgressBar.widget.BootstrapProgressBar", [_WidgetBase], (function(Source: any) {
let result: any = {};
for (let i in Source.prototype) {
if (i !== "constructor" && Source.prototype.hasOwnProperty(i)) {
result[i] = Source.prototype[i];
}
}
return result;
} (BootstrapProgressBar)));
export = BootstrapProgressBar;
子类化将处理方法def。但是我如何使用参数在B.myMethod中调用this.inherited(arguments)呢。另外,我认为我们需要调用dojo.declare来为每个类添加更多的方法来处理dojo特定的功能。ts文件用于描述现有JavaScript代码的声明,以便TypeScript知道如何与之交互。它只有签名,没有代码。如果你想要一个TypeScript类,它做的事情和你的一样,那完全是另外一回事。我会编辑答案。事实上我两个都想要。d、 ts更容易。但是对于ts,我甚至不能编译,因为这个.inherited(arguments)。我添加了一个更复杂的多重继承案例。如何转换此类型脚本0.9?(此)。继承的(参数)将使编译器允许该语句通过。多重继承通常不是一个好主意,TypeScript不支持它。尝试使用组合而不是继承。我不建议将Dojo的类功能转换为TypeScript的简单原型类。Dojo的类设施包含许多附加特性(例如,包括多重继承)。但是,您当然可以继续将dojo/declare与TypeScript一起使用。唯一的一点是,要获得Dojo类的方法名的Intellisense并不容易——您必须编写自己的.d.ts文件。我这里有Dojo类型定义文件:Stephen,你说得对。但是我想尝试一下,因为TypeScript有很好的类型检查,我想使用类似于C#的接口/类构造。我很惊讶以前没有人这样做。我同意。最好将TypeScript的类与其他Dojo模块结合起来。当前使用的Dojo类不允许对属性进行类型检查(例如,get/set将返回any)。但是,您需要一个方法来翻译Dojo定义属性的setXXX/getXXX方法,它在TypeScript中不应该有任何对应的方法。另外,所有的dijit都在Dojo类中,因此您将无法在那里避免它…Stephen,我已经下载了您的d.ts文件并尝试调用Dojo.declare函数。导入dojo_declare=require(“dojo/_base/declare”);导入widget=require(“Dijit/_widget”);import templatedMixin=require(“Dijit/_templatedMixin”);var x=dojo_declare(“MyWidget”,[widget,templateddmixin]);导出=x;我遇到一个错误:无法调用没有调用签名的类型。知道如何调用dojodeclare吗?快速回答:它是
importx=module(“…”)代码>使用“require”而不是“module”会导致模块没有类型信息。