如何使用Typescript编写dojo.declare和继承的函数?

如何使用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

我使用的是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!");
    }
});

// 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”会导致模块没有类型信息。