Puis-je définir une interface pour chaque propriété d'un objet juste une fois?

voix
0

Voici ma propriété où l'interface est définie plusieurs fois:

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

Voici l'interface que j'ai:

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

Est-il possible que je peux éviter d'avoir à spécifier l'interface après chaque propriété de ExamStatusId?

Créé 16/07/2014 à 18:20
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Vous n'avez pas inclus la elempropriété, donc vous devez le faire (bien que ce soit tangentielle).

Ma recommandation est que vous embrassez la merveille de l'inférence de type, et faire ceci:

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

Si vous n'avez pas inclus les propriétés correctes lorsque vous déclarez que la ExamStatusIdpropriété de votre classe, le compilateur détecter correctement le problème et vous dire à ce sujet, car il comparera le meilleur type commun dans le ExamStatusIdavec l' IEnumElementinterface (même si vous ne manqué elemhors d'un, vous obtiendrez l'avertissement.

Créé 16/07/2014 à 18:56
source utilisateur

voix
1

Oui, cela est possible avec une interface supplémentaire comme le code ci-dessous. L'interface IIndexable générique rend aussi facile à utiliser sur des endroits différents!

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: La bonne chose sur l'utilisation de l'interface est que vous obtiendrez autocomplétion aussi!

Créé 16/07/2014 à 18:32
source utilisateur

voix
0

Cela dépend de votre objectif. Si votre but est d'obtenir le contrôle IntelliSense + type lors de l'accès aux membres de l'objet comme indiqué ci-dessous:

entrez la description d'image ici

Et vous voulez que la vérification de type IntelliSense de + lors de la création des membres:

entrez la description d'image ici

Ensuite, la solution que vous avez est le meilleur que je peux penser.

Créé 17/07/2014 à 00:40
source utilisateur

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