Kan jeg definere et grensesnitt for hver eiendom som tilhører et objekt bare den ene gangen?

stemmer
0

Her er min eiendom hvor grensesnittet er definert flere ganger:

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

Her er grensesnittet som jeg har:

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

Er det noen måte jeg kan slippe å spesifisere grensesnittet etter hver eiendom ExamStatusId?

Publisert på 16/07/2014 klokken 17:20
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Du har ikke tatt den elemegenskapen, så du må gjøre det (selv om dette er tangentiell).

Min anbefaling er at du omfavner det rart av type slutning, og gjør dette:

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

Hvis du ikke har de riktige egenskapene når du erklært ExamStatusIdeiendommen på din klasse, vil kompilatoren riktig oppdage problemet, og fortelle deg om det, fordi det vil sammenligne den beste vanligste typen i ExamStatusIdmed IEnumElementgrensesnitt (så selv om du bare savnet elemav av en, vil du få advarsel.

Svarte 16/07/2014 kl. 17:56
kilden bruker

stemmer
1

Ja det er mulig med en ekstra interface som koden under. Den generiske IIndexable grensesnittet gjør det også lett å bruke på forskjellige steder!

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: Det fine med å bruke grensesnittet er at du vil få autofullføring også!

Svarte 16/07/2014 kl. 17:32
kilden bruker

stemmer
0

Avhenger av formålet. Hvis formålet er å få IntelliSense + type sjekking ved tilgang medlemmer av objektet som vist nedenfor:

skriv bildebeskrivelse her

Og du vil at IntelliSense + type sjekking når du oppretter de enkelte medlemmer:

skriv bildebeskrivelse her

Så løsningen du har er det beste jeg kan tenke på.

Svarte 16/07/2014 kl. 23:40
kilden bruker

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