Mohu definovat rozhraní pro každou vlastnost objektu jen jeden čas?

hlasů
0

Tady je můj majetek, kde je rozhraní definována vícekrát:

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

Zde je rozhraní, které mám:

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

Existuje nějaký způsob, že mohu vyhnout se nutnosti určit rozhraní po každém majetku ExamStatusId?

Položena 16/07/2014 v 18:20
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Jste nezahrnuli do elemvlastnictví, takže je potřeba k tomu, že (i když je to tangenciální).

Mé doporučení je, že přijmout zázrak typu závěru, a to následujícím způsobem:

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

Pokud jste neobsahoval správné vlastnosti, když prohlásil ExamStatusIdmajetek na svou třídu, kompilátor bude správně rozpoznat problém a informovat vás o tom, protože to bude porovnávat nejlepší společný typ v ExamStatusIds IEnumElementrozhraním (takže i když jenom vynechal elemoff jednoho, měli byste dostat varování.

Odpovězeno 16/07/2014 v 18:56
zdroj uživatelem

hlasů
1

Ano, to je možné s extra rozhraní jako níže uvedený kód. Generická IIndexable rozhraní umožňuje také snadné použití na různých místech!

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: Pěkná věc, o použití rozhraní je, že dostanete automatické doplňování taky!

Odpovězeno 16/07/2014 v 18:32
zdroj uživatelem

hlasů
0

Závisí na daný účel. Pokud váš cílem je získat kontrolu intellisense + typ při přístupu k členy objektu, jak je uvedeno níže:

zadejte popis obrázku zde

A chcete Kontrola intellisense typ + při vytváření jednotlivých členů:

zadejte popis obrázku zde

Potom se roztok máte, je nejlepší co mě napadlo.

Odpovězeno 17/07/2014 v 00:40
zdroj uživatelem

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