2013-01-04 17 views
5

Ho un'interfaccia TypeScript. Il problema è che ha circa 40 membri. Quando lo uso e implemento solo i membri scelti, ottengo un errore che manca. Come ignorarlo? Devo implementarli tutti? Questo problema mi impedisce di trasmettere un tipo in un altro.Implementare tutti i membri dell'interfaccia

E.g.

interface A { 
    // 40 members 
} 

class B implements A { 
    // only 5 members implemented 
} 

// somewhere in the code 
var myVar1: A = something; 
var myVar2: B = <B> myVar1; // here an error (can't convert because B has missing some properties and methods:/) 
+1

La regola per le interfacce in tutte le lingue che ho incontrato è che devi implementare tutti i suoi metodi. –

risposta

10

a macchina è possibile contrassegnare gli elementi come optional:

interface Person { 
    name: string; 
    address?: string; 
} 

nome è obbligatorio e l'indirizzo è facoltativo per l'implementazione

+0

+1: questo è un buon suggerimento. – Fenton

+1

È necessario implementare l'intera interfaccia ma è possibile renderla facoltativa, come mostrato qui. Tuttavia, se vuoi veramente implementarle tutte a volte, ma altre volte vuoi un set diverso, puoi creare qualcosa come @SteveFenton mostra sotto –

5

Se si promette di implementare un'interfaccia, è necessario implementare tutto.

Una soluzione sarebbe quella di avere una classe base che implementa le 40 proprietà se desideri solo a che fare con 5 immobili a B.

interface A { 
    propA: string; 
    propB: string; 
} 

class C implements A { 
    public propA = ""; 
    public propB = ""; 
} 

class B extends C { 
    public propB = "Example"; 
} 

var myVar1: A; 
var myVar2: B = <B> myVar1; 
4

40 elementi in un'interfaccia è abbastanza.

Inoltre, se è necessario solo 5 per una determinata classe, indica un problema di progettazione.

Un progetto alternativo è quello di disporre di più interfacce correlate e dividere le proprietà in gruppi più logici.

interface ICar ... 
interface IRacingCar : ICar 
interface IFlyingCar : ICar 
interface IFamilyCar : ICar 

Quindi è possibile avere una classe che implementa effettivamente più interfacce.

class RaceCar: IRacingCar ... 
class FlyingRaceCar: IRaceCar, IFlyingCar ... 
class FlyingFamilyCar: IFlyingCar, IFamilyCar ... 

Inoltre, si dovrebbe evitare di trasmettere da un'interfaccia a una classe specifica a meno che non si sia certi che l'oggetto sia effettivamente tale classe. Il problema si verificherà se si tenta di utilizzare un metodo di quella classe che in realtà non esiste se l'oggetto non è realmente quel tipo.

Problemi correlati