Kann ich eine Schnittstelle für jede Eigenschaft eines Objekts nur das eine Mal definieren?

stimmen
0

Hier ist mein Eigentum, wo die Schnittstelle mehrfach definiert ist:

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

Hier ist die Schnittstelle, die ich habe:

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

Gibt es eine Möglichkeit, dass ich vermeiden kann, die die Schnittstelle nach jeder Eigenschaft ExamStatusId angeben?

Veröffentlicht am 16/07/2014 um 18:20
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

Sie haben nicht die mitgelieferte elemEigenschaft, so müssen Sie das tun (obwohl dies tangential).

Meine Empfehlung ist, dass Sie die Wunder der Typinferenz zu umarmen, und dies tun:

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

Wenn Sie nicht die richtigen Eigenschaften enthalten haben , wenn Sie die deklarierte ExamStatusIdEigenschaft auf Ihrer Klasse, würde der Compiler das Problem richtig erkennen und Ihnen davon erzählen, weil es die beste gemeinsame Art im Vergleich wird ExamStatusIdmit der IEnumElementSchnittstelle (also auch wenn Sie nur verpasst elemweg von einem, dann würden Sie die Warnung.

Beantwortet am 16/07/2014 um 18:56
quelle vom benutzer

stimmen
1

Ja, das ist möglich mit einer zusätzlichen Schnittstelle wie der Code unten. Die generische IIndexable Schnittstelle macht es auch einfach an verschiedenen Orten nutzen zu können!

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: Das Schöne an der Schnittstelle zu verwenden ist, dass Sie die automatische Vervollständigung erhalten!

Beantwortet am 16/07/2014 um 18:32
quelle vom benutzer

stimmen
0

Hängt von Ihrem Zweck. Wenn Ihr Ziel ist es, die Intellisense + Typprüfung zu erhalten, wenn die Mitglieder des Objekts zugreifen, wie unten dargestellt:

Geben Sie hier image description

Und Sie wollen die Intellisense + Typprüfung , wenn die einzelnen Mitglieder zu schaffen:

Geben Sie hier image description

Dann wird die Lösung, die Sie haben, ist die beste, die ich denken kann.

Beantwortet am 17/07/2014 um 00:40
quelle vom benutzer

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