Posso definire un'interfaccia per ogni proprietà di un oggetto appena l'unica volta?

voti
0

Ecco la mia proprietà in cui l'interfaccia è definito più volte:

    ExamStatusId = {
        All: <IEnumElement>{
            id: this.examStatusSelectId,
            text: 'Exam Status: All',
            val: 0
        },
        Current: <IEnumElement>{
            id: this.examStatusSelectId,
            text: 'Exam Status: Current',
            val: 1
        }
    }

Ecco l'interfaccia che ho:

interface IEnumElement {
    elem: string;
    text: string;
    val: number
}

C'è un modo che io possa evitare di dover specificare l'interfaccia dopo ogni proprietà di ExamStatusId?

È pubblicato 16/07/2014 alle 18:20
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

Non hai incluso la elemproprietà, quindi è necessario farlo (anche se questo è tangenziale).

La mia raccomandazione è che si abbracciare la meraviglia di inferenza di tipo, e fare questo:

interface IEnumElement {
    elem: string;
    text: string;
    val: number
}

class Exam {
    private examStatusSelectId: number;

    ExamStatusId = {
        All: {
            id: this.examStatusSelectId,
            elem: '',
            text: 'Exam Status: All',
            val: 0
        },
        Current: {
            id: this.examStatusSelectId,
            elem: '',
            text: 'Exam Status: Current',
            val: 1
        }
    }
}

// This function must be passed an IEnumElement
function example(element: IEnumElement) {

}

var exam = new Exam();

// The compiler knows this is good
example(exam.ExamStatusId.All);

Se non si includono le proprietà corrette quando hai dichiarato la ExamStatusIdproprietà sulla vostra classe, il compilatore avrebbe correttamente rilevare il problema e dire a questo proposito, perché sarà confrontare il miglior tipo comune nel ExamStatusIdcon l' IEnumElementinterfaccia (quindi, anche se solo perso elemfuori di uno, si otterrebbe l'avvertimento.

Risposto il 16/07/2014 a 18:56
fonte dall'utente

voti
1

Sì che è possibile con un'interfaccia extra come il codice qui sotto. L'interfaccia IIndexable generica rende anche facile da usare sui posti differenti!

interface IEnumElement {
    elem: string;
    text: string;
    val: number
}

interface IIndexable<T> {
    [index: string]: T;
}

var ExamStatusId: IIndexable<IEnumElement>  = {
    All: {
        elem: "",
        text: 'Exam Status: All',
        val: 0
    },
    Current: {
        elem: "asdf",
        text: 'Exam Status: Current',
        val: 1
    }, 
    X:  {} // this is now an error!
}

edit: La cosa bella utilizzando l'interfaccia è che otterrete il completamento automatico troppo!

Risposto il 16/07/2014 a 18:32
fonte dall'utente

voti
0

Dipende il vostro scopo. Se il vostro scopo è quello di ottenere il controllo intellisense + tipo quando si accede membri dell'oggetto come illustrato di seguito:

entrare descrizione dell'immagine qui

E si desidera che l'intellisense tipo + verifica durante la creazione dei singoli membri:

entrare descrizione dell'immagine qui

Quindi la soluzione che hai è il migliore che mi viene in mente.

Risposto il 17/07/2014 a 00:40
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more