javascript - Hur deklarerar man nästlade funktioner i en TypeScript-deklarationskällfil?
Jag håller på att bygga en deklarationskällfil för KeyboardJS. API:et refereras från ett statiskt objekt (KeyboardJS) som instansieras när JavaScript-filen laddas. Några av metoderna i API:et är inbäddade under andra metoder. Till exempel:
KeyboardJS.clear(keyCombo);
och
KeyboardJS.clear.key(key);
Här är min gränssnittsdefinition:
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;
}
TypeScript-pluginet för Visual Studio 2012 genererar ett fel på clear.key-raden och rekommenderar ett semikolon där punkten är. Har någon skapat en definitionsfil med ett liknande scenario? Tack!
Svar #1
Du kan deklarera samtalsignaturer på typer så här:
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
Svar #2
Geni kommentar från Ryan. Genom att använda samma mönster som jQuery-definitionen kan du göra:
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('');
