在不改变现有JavaScript代码的情况下创建TypeScript声明文件

时间:2014-11-07 05:59:44

标签: typescript

我们有大量的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;
    },
  };

2 个答案:

答案 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;
    }
}