由于不推荐tsd
,我正在尝试将DefinitelyTyped
上的环境声明文件迁移到结构typings
鼓励(外部模块)。以下是我为KeyboardJS typings repo制作的the GitHub issue以及导致此问题的external module。
KeyboardJS非常简单(3个类,2个接口,1个实例),但为它创建一个合适的.d.ts
文件对我来说很麻烦。我的要求很简单:
问题在于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还有另外两个接口(但不公开),KeyEvent
和EventHandler
:
interface KeyEvent extends KeyboardEvent {
preventRepeat(): void;
pressedKeys: string;
}
interface EventHandler {
(e?: KeyEvent): void;
}
因此,.d.ts
文件需要公开Keyboard
,Locale
和& KeyCombo
个类以及default
(作为Keyboard
的实例) - 作为some limitations。我应该能够编写扩展JavaScript类的TypeScript类。另外,我需要能够编写KeyEvent
和EventHandler
作为参数的函数。
这是否可以使用TypeScript的当前状态,或者我是否需要提交TypeScript错误以支持此方案?如果可能,我将如何编写.d.ts
文件?
答案 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;