我们有大量的javascript,我们希望开始进入TypeScript世界。理想情况下,我们可以创建TypeScript声明文件,而无需更改现有的javascript代码。
下面是微软Ajax Timer的一小段代码,它与我们想要为其创建声明文件的代码类型非常一致。
我花了几个小时试图创建一个使TypeScript满意的声明文件,但到目前为止它还没有很好用。
以下代码的声明文件如何显示?
Type.registerNamespace("Nmspc");
Nmspc.Timer = function () {
Nmspc.Timer.initializeBase(this);
this._interval = 1000;
this._enabled = false;
this._timer = null;
};
Nmspc.Timer.prototype = {
get_interval: function() {
return this._interval;
},
set_interval: function(value) {
if (this._interval !== value) {
// snip
}
},
get_enabled: function() {
return this._enabled;
},
};
答案 0 :(得分:2)
如果您的代码组织遵循external modules模式,您的模块加载器将是amd
,那么
(1)将代码转换为Timer.ts
可能如下所示:
class Timer {
private _interval: number;
private _enabled: boolean;
private _timer: any;
constructor() {
// super();
this._interval = 1000;
this._enabled = false;
this._timer = null;
}
get_interval(): number {
return this._interval;
}
set_interval(value: number): void {
if (this._interval !== value) {
// snip
}
}
get_enabled(): boolean {
return this._enabled;
}
}
export = Timer;
和(2)命令
tsc Timer.ts --declaration --module amd
将(3)生成Timer.d.ts
,如下所示:
declare class Timer {
private _interval;
private _enabled;
private _timer;
constructor();
get_interval(): number;
set_interval(value: number): void;
get_enabled(): boolean;
}
export = Timer;
正确的编码取决于代码库的其余部分如何使用代码的JavaScript部分。 https://github.com/borisyankov/DefinitelyTyped中的示例当然是一个很好的指南
使用(4)接口的另一种可能的手工编码可能如下所示:
interface ITimer {
get_interval(): number;
set_interval(value: number): void;
get_enabled(): boolean;
}
interface Nmspc {
Timer: {
new(): ITimer;
}
}
答案 1 :(得分:1)
这对你有帮助吗?
declare module Nmspc {
export class Timer {
public interval: number;
public enabled: boolean;
}
}