У меня есть набор классов с достаточно простым набором полей:Машинопись 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(), и он действительно вызывает метод?
Помещение '' перед выражением не превращает объект в экземпляр этого интерфейса. Он просто сообщает компилятору TypeScript _assume_, что он является экземпляром этого интерфейса. Ответ на ваш вопрос: http://stackoverflow.com/questions/5873624/parse-json-string-into-a-particular-object-prototype-in-javascript –
JLRishe
Спасибо, я увидел этот вопрос, и я все еще надеюсь, что есть лучший ответ, я думаю. В противном случае мне кажется, что мне нужно создать конструктор для каждого объекта, который принимает анализируемый объект (или его свойства) и отображает их. Простой для объекта в этом вопросе, но утомительный для более сложных графиков объектов ... – Jaymz