2016-04-22 21 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的解決方案。