Pot defini o interfață pentru fiecare proprietate a unui obiect doar o dată?

voturi
0

Aici e proprietatea mea în cazul în care interfața este definit de mai multe ori:

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

Iată interfața pe care o am:

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

Există vreo modalitate prin care pot evita pentru a specifica interfața după fiecare proprietate de ExamStatusId?

Întrebat 16/07/2014 la 18:20
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

Nu ați inclus elemproprietatea, deci trebuie să faci asta (deși acest lucru este tangențială).

Recomandarea mea este să îmbrățișeze minunea de tip deducție, și de a face acest lucru:

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

Dacă nu ați inclus proprietățile corecte atunci când a declarat ExamStatusIdproprietate pe clasa ta, compilatorul ar detecta în mod corect problema și să vă spun despre asta, pentru că va compara cel mai bun tip comună în ExamStatusIdcu IEnumElementinterfața (astfel încât , chiar dacă numai ratat de elempe unul, ai primi avertisment.

Publicat 16/07/2014 la 18:56
sursa de către utilizator

voturi
1

Da, care este posibil, cu o interfață suplimentară, cum ar fi codul de mai jos. Generic Interfața IIndexable face, de asemenea, ușor de utilizat, pe diferite locuri!

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!
}

edita: Cel mai frumos lucru despre utilizarea interfeței este că veți primi autocompletare prea!

Publicat 16/07/2014 la 18:32
sursa de către utilizator

voturi
0

Depinde de scopul tau. În cazul în care scopul este de a obtine Intellisense + tip verificarea la accesarea membrii obiectului așa cum este prezentat mai jos:

introduceți descrierea imaginii aici

Și doriți verificarea Intellisense + tip la crearea membrilor individuali:

introduceți descrierea imaginii aici

Apoi soluția aveți este cel mai bun mă pot gândi.

Publicat 17/07/2014 la 00:40
sursa de către utilizator

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