2016-04-22 48 views
1

我有一组类有一个相当简单的字段集:打字稿JSON反序列化接口失踪方法

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的数组各自具有其textvalue字段的值。

别的地方,我得已从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 { ... } 
} 

在你的Ajax回调,从您的JSON对象创建测验对象:

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

我详述在post的解决方案。