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;

Relaterte artikler