Kan ik een interface voor elke eigenschap van een object slechts één keer te definiëren?

stemmen
0

Hier is mijn pand waar de interface meerdere keren wordt gedefinieerd:

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

Hier is de interface die ik heb:

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

Is er een manier die ik kan voorkomen dat de interface te geven na elke eigenschap van ExamStatusId?

De vraag is gesteld op 16/07/2014 om 18:20
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

Je hebt niet het elempand, dus je moet om dat te doen (hoewel dit raakt).

Mijn aanbeveling is dat je het wonder van het type gevolgtrekking te omarmen, en dit te doen:

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

Als u geen rekening gehouden met de juiste eigenschappen als je de aangegeven ExamStatusIdwoning op je klas, dan zou de compiler goed detecteren van het probleem en je vertellen, omdat het de beste gemeenschappelijke type zal te vergelijken in de ExamStatusIdmet de IEnumElementinterface (dus zelfs als u alleen miste elemoff van één, zou je de waarschuwing.

antwoordde op 16/07/2014 om 18:56
bron van user

stemmen
1

Ja, dat is mogelijk met een extra interface zoals de onderstaande code. De generieke IIndexable interface maakt het ook gemakkelijk te gebruiken op verschillende plaatsen!

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: Het aardige ding over het gebruik van de interface is dat je autocompletion ook krijgt!

antwoordde op 16/07/2014 om 18:32
bron van user

stemmen
0

Hangt af van uw doel. Als uw doel is om de intellisense + type checking krijgen bij de toegang tot de leden van het object, zoals hieronder weergegeven:

voer image beschrijving hier

En je wilt dat de intellisense + type checking bij het maken van de individuele leden:

voer image beschrijving hier

Dan is de beste die ik kan bedenken van de oplossing die je hebt.

antwoordde op 17/07/2014 om 00:40
bron van user

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