¿Puedo definir una interfaz para cada propiedad de un objeto sólo una vez?

votos
0

Aquí está mi propiedad donde la interfaz se define en múltiples ocasiones:

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

Esta es la unión que tengo:

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

¿Hay alguna manera de que pueda evitar tener que especificar la interfaz después de cada propiedad de ExamStatusId?

Publicado el 16/07/2014 a las 18:20
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

No se ha incluido la elempropiedad, por lo que necesita para hacer eso (aunque esto es tangencial).

Mi recomendación es que usted abraza la maravilla de la inferencia de tipos, y hace esto:

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 usted no incluyó las propiedades correctas cuando se declaró la ExamStatusIdpropiedad en su clase, el compilador podría detectar correctamente el problema y le dirá al respecto, porque va a comparar el mejor tipo común en el ExamStatusIdcon la IEnumElementinterfaz (por lo que incluso si sólo perdido elemfuera de uno, se obtendría la advertencia.

Respondida el 16/07/2014 a las 18:56
fuente por usuario

votos
1

Sí que es posible con una interfaz extra, como el código de abajo. La interfaz genérica IIndexable hace que sea también fácil de usar en diferentes lugares!

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: Lo bueno de usar la interfaz es que obtendrá la terminación automática también!

Respondida el 16/07/2014 a las 18:32
fuente por usuario

votos
0

Depende de su propósito. Si su objetivo es conseguir la comprobación intelisense + tipo cuando se accede a los miembros del objeto como se muestra a continuación:

introducir descripción de la imagen aquí

Y desea que la comprobación intelisense + tipo al crear los miembros individuales:

introducir descripción de la imagen aquí

A continuación, la solución que tiene es el mejor que se pueda imaginar.

Respondida el 17/07/2014 a las 00:40
fuente por usuario

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