2012-10-05 13 views
7

Estoy intentando crear un archivo .d.ts para la biblioteca KineticJS. Hasta ahora he creado la siguiente declaración de interfaz "kinect.d.ts". (Coseché el código un poco para stackoverflow pero espero que se entiende la idea)Cómo creo declaraciones de clase ambiental en 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 
     */ 
    } 
} 

me esperaba que esto sería suficiente para poder para crear un objeto Kinetic.Rect en mis app.ts archivo

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

Pero parece que tengo que hacer un trabajo extra para usar las clases KineticJS (como Rect) a máquina de escribir. ¿Alguien podría dar algunos consejos sobre cómo archivar esto?

Respuesta

6

¿Has mirado en el ejemplo aplicación mecanografiado en: http://typescript.codeplex.com/SourceControl/changeset/view/fe3bc0bfce1f#samples/imageboard/mongodb.ts

El código en este enlace crea una definición para la biblioteca mongodb. Una diferencia entre esto y la respuesta Sohnee es que Sohnee implementa el constructor en contraste con el siguiente recorte de código del enlace que es una clase de stub. No tengo suficiente reputación para preguntarle a Sohnee en la respuesta aceptada por qué implementó el constructor para una clase ambiental.

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

Esto parece prometedor, lo echaré un vistazo esta noche –

+0

Sí, ¡esto es! Esto es lo que estaba buscando. Ahora puedo escribir 'var server = new mongodb.Server (" ", 1," something "," ");' sin tener que convertirlo al tipo correcto. –

5

Aquí está mi ejemplo práctico de creación de definiciones de ambiente para su clase Kinetic:

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   
}); 

Tenga en cuenta que he utilizado declare var Kinetic: IKinetic; a decir que mecanografiado cinética es del tipo particular.

Actualización - Ejemplo 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

Hola Sohnee, su ejemplo parece funcionar, pero Tu lugar ideal para devolver el tipo Rect (o como en tu ejemplo el tipo Shape). De esta forma, Intellisense muestra todos los métodos del tipo devuelto. Intenté agregar: forma a su ejemplo interfaz IKinetic { Rect (forma: forma); } pero luego aparece el error del compilador "nueva expresión solo válida para los constructores" –

+0

También gracias por su sugerencia –

+0

Agregaré el tipo de devolución a la interfaz para usted ... – Fenton

0

ITodoStorage es realmente interfaz, es TodoStorage aplicación, pero no me gustaría definir la clase, porque eso me obligan a poner en práctica todos los miembros. En su lugar, también hago la interfaz TodoStorage. Finalmente declaro var como constructor con palabra clave nueva.

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

declare interface TodoStorage extends ITodoStorage { 
} 

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

entonces yo soy capaz de llamar al constructor

var storageService : ITodoStorage = new TodoStorage(); 

Por desgracia, el var se esconde el tipo TodoStorage.

0

Comprendo que esto es ya viejo, pero se puede encontrar un archivo de kinetic.d.ts completado aquí: http://kineticjstypescript.codeplex.com/

+1

Jeje sí, esa es la definición que hice después de resolver mi problema :) –

Cuestiones relacionadas