2012-10-05 15 views
7

Próbuję utworzyć plik .d.ts dla biblioteki KineticJS. Do tej pory stworzył następującą deklarację Interface „kinect.d.ts.” (I przycięte kod trochę do stackoverflow, ale mam nadzieję, że masz pomysł)Jak utworzyć deklaracje klasy środowiskowej w TypeScript

module Kinetic { 

    interface Rect extends Shape { 
     constructor (config) ; 
    } 

    interface Shape extends Node 
    { 

    } 

    interface Node { 
     constructor (config); 
     clone(attrs): Node; 
     getAbsoluteOpacity(): number; 
     getAbsolutePosition(): any;  

     /* 
     other methods removed for stackoverflow example 
     */ 
    } 
} 

mam nadzieję, to byłoby na tyle, aby móc aby utworzyć obiekt Kinetic.Rect w moich app.ts złożyć

/// <reference path="Kinetic.d.ts" /> 
var rect = new Kinetic.Rect({ 
      x: 239, 
      y: 75, 
      width: 100, 
      height: 50   
     }); 

Ale wydaje się, muszę zrobić jakąś dodatkową pracę, aby skorzystać z klas KineticJS (jak Rect) w maszynopisie. Czy ktokolwiek mógłby dać kilka wskazówek, jak to zarchiwizować?

Odpowiedz

6

Pan spojrzał na przykładzie aplikacji maszynopis w: http://typescript.codeplex.com/SourceControl/changeset/view/fe3bc0bfce1f#samples/imageboard/mongodb.ts

kodu pod tym linkiem tworzy definicję dla biblioteki MongoDB. Jedną różnicą między tą a Sohnee jest to, że Sohnee implementuje konstruktora w przeciwieństwie do następującego wycinka kodu z linku, który jest klasą pośrednią. Nie mam dość reputacji, by zapytać Sohnee w zaakceptowanej odpowiedzi, dlaczego zaimplementował konstruktora dla klasy ambientowej?

declare module "mongodb" { 
    export class Server { 
     constructor(host: string, port: number, opts?: any, moreopts?: any); 
    } 
    export class Db { 
     constructor(databaseName: string, serverConfig: Server); 
     public open(callback:()=>void); 
+0

To wygląda obiecująco, przyjrzę się temu dziś wieczorem. –

+0

Tak, to jest to! Tego właśnie szukałem. Teraz mogę napisać 'var server = new mongodb.Server (" ", 1," something "," ");' bez konieczności rzutowania na odpowiedni typ. –

5

Oto mój przykład praca tworzenia definicji otoczenia dla Kinetic klasy:

interface Shape { 
    x: number; 
    y: number; 
    width: number; 
    height: number; 
} 

interface IKinetic { 
    Rect(shape: Shape); 
} 

declare var Kinetic: IKinetic; 

var rect = <Shape> new Kinetic.Rect({ 
    x: 239, 
    y: 75, 
    width: 100, 
    height: 50   
}); 

Zauważ, że użyłem declare var Kinetic: IKinetic; powiedzieć, że maszynopis Kinetic jest od konkretnego typu.

Update - Przykład 2

interface IShape { 
    x: number; 
    y: number; 
    width: number; 
    height: number; 
} 

interface IRect extends IShape { 

} 

module Kinetic { 
    export class Rect implements IRect { 
     public x: number; 
     public y: number; 
     public width: number; 
     public height: number; 
     constructor(rect: IShape) { 
      this.x = rect.x; 
      this.y = rect.y; 
      this.width = rect.width; 
      this.height = rect.height; 
     } 
    } 
} 

var rect = new Kinetic.Rect({ 
    x: 239, 
    y: 75, 
    width: 100, 
    height: 50   
}); 
+0

Hi Sohnee, Twój przykład wydaje się działać, ale Idealnie chciałabym wrócić typ Rect (lub jak w twoim przykładzie typ Kształt). W ten sposób Intellisense pokazuje wszystkie metody zwracanego typu. Próbowałem dodać: Kształt do Twojego przykładu interfejs IKinetic { Rect (shape: Shape); } , ale potem pojawia się błąd kompilatora "nowe wyrażenie ważne tylko dla konstruktorów" –

+0

Również dla twojej sugestii –

+0

Dodam typ zwrotu do interfejsu dla ciebie ... – Fenton

0

ITodoStorage jest naprawdę interfejs, TodoStorage jest realizacja, ale nie chciałbym, aby określić klasę, bo to zmusiłoby mnie do wdrożenia wszystkich członków. Zamiast tego tworzę interfejs TodoStorage. Na koniec deklaruję var jako konstruktor z nowym słowem kluczowym.

declare interface ITodoStorage { 
    get_todos() : TodoItem[]; 
    set_todos(value : TodoItem[]) : void; 
} 

declare interface TodoStorage extends ITodoStorage { 
} 

declare var TodoStorage : { 
    new(): TodoStorage; 
} 

Wtedy jestem w stanie wywołać konstruktora

var storageService : ITodoStorage = new TodoStorage(); 

Niestety var ukrywa typ TodoStorage.

0

Rozumiem to teraz stary, ale można znaleźć tutaj złożyć wypełniony kinetic.d.ts: http://kineticjstypescript.codeplex.com/

+1

Hehe tak, to jest definicja, którą zrobiłem po rozwiązaniu mojego problemu :) –

Powiązane problemy