Могу ли я определить интерфейс для каждого свойства объекта только один раз?

голоса
0

Вот моя собственность, где интерфейс определяется несколько раз:

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

Вот интерфейс, который у меня есть:

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

Есть ли способ, что я могу избежать того, чтобы указать интерфейс после каждого свойства ExamStatusId?

Задан 16/07/2014 в 18:20
источник пользователем
На других языках...                            


3 ответов

голоса
1

Вы не включили elemсвойство, так что вам нужно сделать (хотя это тангенциальное).

Моя рекомендация состоит в том, что вы обнимаете чудо умозаключения типа, и сделать это:

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

Если вы не включили правильные свойства , когда вы объявили о ExamStatusIdсобственности на вашем классе, компилятор правильно определить проблему и сказать вам об этом, потому что он будет сравнивать лучший общий тип в ExamStatusIdс IEnumElementинтерфейсом (так что даже если вы только пропустил elemот одного, вы получите предупреждение.

Ответил 16/07/2014 в 18:56
источник пользователем

голоса
1

Да, это возможно, с дополнительным интерфейсом, как код ниже. Общий IIndexable интерфейс позволяет также легко использовать в разных местах!

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

Редактирование: Хорошая вещь об использовании интерфейса является то, что вы получите автодополнение тоже!

Ответил 16/07/2014 в 18:32
источник пользователем

голоса
0

В зависимости от вашей цели. Если ваша цель состоит в том, чтобы получить IntelliSense + тип проверки при обращении к членам объекта, как показано ниже:

введите описание изображения здесь

И вы хотите , проверку IntelliSense + типа при создании отдельных членов:

введите описание изображения здесь

Тогда решение у вас есть лучший один я могу думать.

Ответил 17/07/2014 в 00:40
источник пользователем

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