如何创建具有多个可能相互冲突的要求的.d.ts文件

时间:2016-04-13 21:11:38

标签: javascript typescript

由于不推荐tsd,我正在尝试将DefinitelyTyped上的环境声明文件迁移到结构typings鼓励(外部模块)。以下是我为KeyboardJS typings repo制作的the GitHub issue以及导致此问题的external module

KeyboardJS非常简单(3个类,2个接口,1个实例),但为它创建一个合适的.d.ts文件对我来说很麻烦。我的要求很简单:

  1. 无环境/全球声明
  2. 能够扩展导出的成员
  3. 能够从非JS导出的成员访问类型信息
  4. 问题在于KeyboardJS如何进行导出:

    var Keyboard = require('./lib/keyboard');
    var Locale   = require('./lib/locale');
    var KeyCombo = require('./lib/key-combo');
    
    var keyboard = new Keyboard();
    
    keyboard.setLocale('us', require('./locales/us'));
    
    exports          = module.exports = keyboard;
    exports.Keyboard = Keyboard;
    exports.Locale   = Locale;
    exports.KeyCombo = KeyCombo;
    

    KeyboardJS还有另外两个接口(但不公开),KeyEventEventHandler

    interface KeyEvent extends KeyboardEvent {
        preventRepeat(): void;
        pressedKeys: string;
    }
    
    interface EventHandler {
        (e?: KeyEvent): void;
    }
    

    因此,.d.ts文件需要公开KeyboardLocale和& KeyCombo个类以及default(作为Keyboard的实例) - 作为some limitations。我应该能够编写扩展JavaScript类的TypeScript类。另外,我需要能够编写KeyEventEventHandler作为参数的函数。

    这是否可以使用TypeScript的当前状态,或者我是否需要提交TypeScript错误以支持此方案?如果可能,我将如何编写.d.ts文件?

1 个答案:

答案 0 :(得分:1)

我创建了test.ts以希望模拟你的库:

export class Keyboard {
    hereiam() { }
}

export class Locale { }

export class KeyCombo { }

let out = new Keyboard();
export default out;

结果d.ts:

export declare class Keyboard {
    hereiam(): void;
}
export declare class Locale {
}
export declare class KeyCombo {
}
declare let out: Keyboard;
export default out;

最后我能够使用它的方式:

import {default as l} from "./test";
l.hereiam();

因此,进一步了解定义,您可以添加两个接口:

declare module "lib" {

    export interface KeyEvent extends KeyboardEvent {
        preventRepeat(): void;
        pressedKeys: string;
    }

    export interface EventHandler {
        (e?: KeyEvent): void;
    }

    export class Keyboard {
        hereiam(): void;
    }
    export class Locale {
    }
    export class KeyCombo {
    }

    let out: Keyboard;
    export default out;
}

然后像这样消费它们:

import * as lib from "lib";
let l = lib.default;
l.hereiam();
let k = new lib.Keyboard();
k.hereiam();

var x: lib.EventHandler;
var y: lib.KeyEvent;
y.preventRepeat;