2015-02-02 15 views
7

Ho una classe Typescript che include un generico che deve estendere un'altra classe e implementare un'interfaccia. Ecco un esempioGeneric generico dattiloscritto che estende classe e interfaccia

interface IHasImage { 
    imageUrl():string; 
} 
class Model { 
} 
class View<T extends Model & IHasImage> { 
} 

Questo è il tipo di sintassi che ho visto altrove, ma c'è un modo di fare questo a macchina?

edit: Prova incollando il seguente dentro al parco giochi: http://www.typescriptlang.org/Playground

...[removed edit 1 code] 

Edit 2: risposta e il ragionamento

(mi scuso, il primo esempio aveva alcuni difetti!) Ho segnato la risposta corretta qui sotto, anche se probabilmente ha bisogno di alcuni suggerimenti come delineato in questo problema github (https://github.com/Microsoft/TypeScript/issues/1885)

Dato il seguente codice è possibile vedere la metodologia funziona.

playground screenshot

L'unica altra cosa da dire è che il tentativo di implement l'interfaccia da una classe che non estende la classe base non riesce anche. Tuttavia, poiché il controllo Typescript è in base alla struttura dell'oggetto, avrà esito positivo se si aggiunge manualmente la proprietà name alla classe.

enter image description here

Questo è anche il motivo per cui riesce con la ModelCorrect che extends ma non lo fa implements.

+0

penso che ci sia un bug nell'esempio. questo nel costruttore non è il valore di tipo generico.La classe dovrebbe avere un modello: T proprietà o constructur può accettare un valore: T argomento – Martijn

risposta

3

Sembra che questo sia l'unico modo di farlo che riesco a trovare. Non perfettamente pulito ma fa la cosa giusta.

interface IHasImage extends Model{ 
    imageUrl():string; 
} 

class Model { 
} 

class View<T extends IHasImage> { 
} 

Ecco uno screenshot dal parco giochi verificare che funziona:

playground

Edit: Aggiunto soluzione corretta.

+0

L'ho provato, e lo compila ma non penso che faccia quello che cerco quando cerco di fare 'this.model .imageUrl() 'lamenta che T non ha una funzione' imageUrl' –

+0

Modificata la mia risposta, con una soluzione alternativa. – dignifiedquire

+0

darò un'occhiata, pensavo di averlo provato ma non avrei potuto farlo –

14

tipografico non è così restrittiva come Java o C# in modo da poter fare cose del genere:

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

// use the Model class like an interface 
interface IHasImageModel extends IHasImage, Model{ 
} 

class View<T extends IHasImageModel> { 
    constructor(arg :T){ 
     arg.imageUrl(); 
    } 
} 

Modifica: a macchina 1.6 è possibile utilizzare i tipi di incrocio:

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

class View<T extends IHasImage & Model> { 
    constructor(arg :T){ 
     arg.imageUrl(); 
    } 
} 
+1

cosa significa 'classe Visualizza ' in realtà? – SuperUberDuper

+1

@SuperUberDuper Questa è una domanda per una nuova voce StackOverflow. In breve, è il modo dattiloscritto per una classe generica https://www.typescriptlang.org/docs/handbook/generics.html#generic-classes È possibile utilizzare questa classe con tutti i tipi che soddisfano i requisiti \t "extens IHasImage & Model " – Magu

+0

great thx !!!!!!!! – SuperUberDuper

1

mancante nell'esempio è ciò che T sarà:

Nell'esempio seguente ho aggiunto un'implementazione per T, che può essere usato come vincolo generico.

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

class ModelWithImage extends Model implements IHasImage { 

    imageUrl():string 
    { 
    return "http://thepetwiki.com/images/thumb/Kitten.jpg/400px-Kitten.jpg"; 
    } 
} 


class View<T extends ModelWithImage> 
{ 
    value:T; 

    constructor(arg:T) 
    { 
     this.value=arg; 
    }  
} 
+0

qui il modello è troppo specifico, sfortunatamente, poiché molti tipi di modello potrebbero avere la stessa funzionalità di 'IHasImage' –

Problemi correlati