2016-04-22 3 views
1

У меня есть набор классов с достаточно простым набором полей:Машинопись JSON Deserialize интерфейс отсутствует методы

interface IQuiz { 
    name: string; 
    questions: Question[]; 
    score(): number; 
} 
export class Quiz implements IQuiz { 
    name: string; 
    questions: Question[]; 
    score(): number { 
     var theScore: number = 0; 
     this.questions.forEach(question => (theScore += question.value)); 
     return theScore; 
    } 
} 

interface IQuestion { 
    text: string; 
    value: number; 
} 
export class Question { 
    text: string; 
    value: number; 
} 

Тогда у меня есть некоторые JSON, представляющий некоторые экземпляры этих объектов. Этот JSON содержит значения для Quiz.name, массив Quiz.questions, каждый со значениями для полей text и value.

Где-то еще, у меня есть ссылка на этот класс викторины, которая была создана из JSON.parse(json) как код ниже:

var json = '{"name": "quizA", "questions": [{"text": "Question A", "value": 0 }, ... ]}' 
var quiz = <IQuiz>JSON.parse(json); 

// Some other stuff happens which assigns values to each question 

var score = quiz.score(); // quiz.score is not a function 

Это кажется десериализованный объект не является на самом деле это реализация интерфейса, предоставляемого.

Как получить ссылку на экземпляр правильного интерфейса, чтобы я мог вызвать quiz.score(), и он действительно вызывает метод?

+0

Помещение '' перед выражением не превращает объект в экземпляр этого интерфейса. Он просто сообщает компилятору TypeScript _assume_, что он является экземпляром этого интерфейса. Ответ на ваш вопрос: http://stackoverflow.com/questions/5873624/parse-json-string-into-a-particular-object-prototype-in-javascript – JLRishe

+0

Спасибо, я увидел этот вопрос, и я все еще надеюсь, что есть лучший ответ, я думаю. В противном случае мне кажется, что мне нужно создать конструктор для каждого объекта, который принимает анализируемый объект (или его свойства) и отображает их. Простой для объекта в этом вопросе, но утомительный для более сложных графиков объектов ... – Jaymz

ответ

0

Нет необходимости в интерфейсах, это добавит дважды работу по поддержанию свойств вашей модели. Добавьте конструктор в свой класс Quiz, чтобы он расширил ваш объект json.

export class Quiz { 
    constructor(json: any) 
    { 
     $.extend(this, json); 

     // the same principle applies to questions: 
     if (json.questions) 
     this.questions = $.map(json.questions, (q) => { return new Question(q); }); 
    } 
    name: string; 
    questions: Question[]; 
    score(): number { ... } 
} 

В вашем АЯКСЕ обратного вызова, создать объект Викторина от вашего JSon объекта:

let newQuiz = new Quiz(jsonQuiz); 
let score = newQuiz.score(); 

Я подробно решения в этой post.

Смежные вопросы