【问题标题】:How to declare nested functions in a TypeScript declaration source file?如何在 TypeScript 声明源文件中声明嵌套函数?
【发布时间】:2012-12-31 10:06:29
【问题描述】:

我正在为KeyboardJS 构建声明源文件。该 API 是从加载 JavaScript 文件时实例化的静态对象 (KeyboardJS) 引用的。 API 的一些方法嵌套在其他方法下。例如:

KeyboardJS.clear(keyCombo);

KeyboardJS.clear.key(key);

这是我的接口定义:

interface KeyboardJSStatic {
    enable(): void;
    disable(): void;
    activeKeys(): string[];
    on(keyCombo:string, onDownCallback?: (keyEvent: Event, keysPressed: string[], keyCombo: string) => {}, onUpCallback?: (keyEvent: Event, keysPressed: string[], keyCombo: string) => {}): KeyboardJSBinding;
    clear(keyCombo: string): void;
    clear.key(keyName: string): void;
    locale(localeName: string): KeyboardJSLocale;
    locale.register(localeName: string, localeDefinition: KeyboardJSLocale): void;
    macro(keyCombo:string , keyNames: string[]): void;
    macro.remove(keyCombo: string): void;
    key: KeyboardJSKey;
    combo: KeyboardJSCombo; 
}

Visual Studio 2012 的 TypeScript 插件在 clear.key 行生成错误,建议在句点所在的位置使用分号。有没有人用类似的场景建立一个定义文件?谢谢!

【问题讨论】:

标签: javascript typescript


【解决方案1】:

来自 Ryan 的天才评论。使用与 jQuery 定义相同的模式,您可以这样做:

interface KeyboardJSClear {
    (keyCombo: string) : void;
    key(keyName: string): void;
}

interface KeyboardJSLocale {
    (localeName: string) : KeyboardJSLocale;
    register(localeName: string, localeDefinition: KeyboardJSLocale): void;
}

interface KeyboardJSMacro {
    (keyCombo:string , keyNames: string[]): void;
    remove(keyCombo: string): void;
}

interface KeyboardJSStatic {
    enable(): void;
    disable(): void;
    activeKeys(): string[];
    on(keyCombo:string, onDownCallback?: (keyEvent: Event, keysPressed: string[], keyCombo: string) => {}, onUpCallback?: (keyEvent: Event, keysPressed: string[], keyCombo: string) => {}): KeyboardJSBinding;
    clear: KeyboardJSClear;
    locale: KeyboardJSLocale;
    macro: KeyboardJSMacro;
    key: KeyboardJSKey;
    combo: KeyboardJSCombo; 
}

declare var KeyboardJS: KeyboardJSStatic;

KeyboardJS.clear('');
KeyboardJS.clear.key('');

【讨论】:

  • 想想 jquery 的定义。 $()$.ajax()
  • 谢谢大家,帮了大忙。
【解决方案2】:

您可以在这样的类型上声明调用签名:

interface KeyboardJSStatic {
    // ...
    clear: {
        (keyCombo: string): void; // Call signature
        key(keyName: string): void; // Method
    };
    // ...
}

var n: KeyboardJSStatic;
n.clear('a'); // OK
n.clear.key('b'); // OK

【讨论】:

  • 没错。您也可以将整个事情声明为 ' interface KeyboardJsClear { }'
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2021-01-20
  • 2017-01-26
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多