TypeScript-modul og klasse samtidig?
Jeg prøver for øyeblikket å lage en TypeScript-definisjonsfil for OpenLayers.
Problemet er at det i OpenLayers finnes visse klasser som både ville oversettes til en modul og en klasse i TypeScript.
For eksempel finnes det Protocol-klassen i modulen OpenLayers og det finnes en klasse Response i modulen OpenLayers.Protocol.
Hvordan kan jeg modellere det i TypeScript? Kan jeg gjøre Protocol til en klasse og definere Response-klassen som en indre klasse som eksporteres? Hvordan ville du gått frem for å løse det problemet?
Svar #1
Deklarer Response som et static-felt i Protocol med en konstruktørtype, som returnerer et interface som definerer Response-klassen:
declare module OpenLayers {
export interface IProtocolResponse {
foo(): void;
}
export class Protocol {
static Response: new () => IProtocolResponse;
}
}
var response = new OpenLayers.Protocol.Response();
response.foo();
Rediger:
Eller som Anders påpeker i dette diskusjonsliste-spørsmålet, kan du ha flere konstruktører for den indre klassen på denne måten:
declare module OpenLayers {
export interface IProtocolResponse {
foo(): void;
}
export class Protocol {
static Response: {
new (): IProtocolResponse;
new (string): IProtocolResponse;
};
}
}
var response = new OpenLayers.Protocol.Response('bar');
response.foo();
Hovedulemperen med begge tilnærmingene er at du ikke kan avlede en klasse fra OpenLayers.Protocol.Response.
Svar #2
Her er mitt oppdaterte svar, som jeg håper hjelper - det bør få deg i gang med å definere OpenType:
declare module OpenType {
export class Protocol {
constructor();
Request;
}
}
var x = new OpenType.Protocol();
var y = new x.Request();
var z = x.Request;
