﻿//----------------------
// <auto-generated>
// </auto-generated>
//----------------------







class Person {
    firstName = ko.observable<string | undefined>();
    lastName = ko.observable<string | undefined>();



    init(data?: any) {
        if (data !== undefined) {
            var firstName_: any;
                firstName_ = _data["FirstName"];
            this.firstName(firstName_);

            var lastName_: any;
                lastName_ = _data["LastName"];
            this.lastName(lastName_);

        }
    }

    static fromJS(data: any): Person {
        let result = new Person();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        let firstName_: any = this.firstName();
        data["FirstName"] = firstName_;

        let lastName_: any = this.lastName();
        data["LastName"] = lastName_;

        return data;
    }
}

class Student extends Person {
    study = ko.observable<string | undefined>();



    override init(data?: any) {
        super.init(data);
        if (data !== undefined) {
            var study_: any;
                study_ = _data["Study"];
            this.study(study_);

        }
    }

    static override fromJS(data: any): Student {
        let result = new Student();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        let study_: any = this.study();
        data["Study"] = study_;

        super.toJSON(data);
        return data;
    }
}

class MyClass {
    name = ko.observable<string | undefined>("foo");
    dateOfBirth = ko.observable<Date>();
    primitiveArray = ko.observableArray<number>();
    primitiveDictionary = ko.observable<{ [key: string]: number; } | undefined>();
    dateArray = ko.observableArray<Date>();
    dateDictionary = ko.observable<{ [key: string]: Date; } | undefined>();
    reference = ko.observable<Student | undefined>();
    array = ko.observableArray<Student>();
    dictionary = ko.observable<{ [key: string]: Student; } | undefined>();



    init(data?: any) {
        if (data !== undefined) {
            var name_: any;
                name_ = _data["Name"] !== undefined ? _data["Name"] : "foo";
            this.name(name_);

            var dateOfBirth_: any;
                dateOfBirth_ = _data["DateOfBirth"] ? new Date(_data["DateOfBirth"].toString()) : undefined as any;
            this.dateOfBirth(dateOfBirth_);

            var primitiveArray_: any;
            if (Array.isArray(_data["PrimitiveArray"])) {
                primitiveArray_ = [] as any;
                for (let item of _data["PrimitiveArray"])
                    primitiveArray_!.push(item);
            }
            this.primitiveArray(primitiveArray_);

            var primitiveDictionary_: any;
            if (_data["PrimitiveDictionary"]) {
                primitiveDictionary_ = {} as any;
                for (let key in _data["PrimitiveDictionary"]) {
                    if (_data["PrimitiveDictionary"].hasOwnProperty(key))
                        (primitiveDictionary_ as any)![key] = _data["PrimitiveDictionary"][key];
                }
            }
            this.primitiveDictionary(primitiveDictionary_);

            var dateArray_: any;
            if (Array.isArray(_data["DateArray"])) {
                dateArray_ = [] as any;
                for (let item of _data["DateArray"])
                    dateArray_!.push(new Date(item));
            }
            this.dateArray(dateArray_);

            var dateDictionary_: any;
            if (_data["DateDictionary"]) {
                dateDictionary_ = {} as any;
                for (let key in _data["DateDictionary"]) {
                    if (_data["DateDictionary"].hasOwnProperty(key))
                        (dateDictionary_ as any)![key] = _data["DateDictionary"][key] ? new Date(_data["DateDictionary"][key].toString()) : undefined as any;
                }
            }
            this.dateDictionary(dateDictionary_);

            var reference_: any;
            reference_ = _data["Reference"] ? Student.fromJS(_data["Reference"]) : undefined as any;
            this.reference(reference_);

            var array_: any;
            if (Array.isArray(_data["Array"])) {
                array_ = [] as any;
                for (let item of _data["Array"])
                    array_!.push(Student.fromJS(item));
            }
            this.array(array_);

            var dictionary_: any;
            if (_data["Dictionary"]) {
                dictionary_ = {} as any;
                for (let key in _data["Dictionary"]) {
                    if (_data["Dictionary"].hasOwnProperty(key))
                        (dictionary_ as any)![key] = _data["Dictionary"][key] ? Student.fromJS(_data["Dictionary"][key]) : new Student();
                }
            }
            this.dictionary(dictionary_);

        }
    }

    static fromJS(data: any): MyClass {
        let result = new MyClass();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        let name_: any = this.name();
        data["Name"] = name_;

        let dateOfBirth_: any = this.dateOfBirth();
        data["DateOfBirth"] = dateOfBirth_ ? dateOfBirth_.toISOString() : undefined as any;

        let primitiveArray_: any = this.primitiveArray();
        if (Array.isArray(primitiveArray_)) {
            data["PrimitiveArray"] = [];
            for (let item of primitiveArray_)
                data["PrimitiveArray"].push(item);
        }

        let primitiveDictionary_: any = this.primitiveDictionary();
        if (primitiveDictionary_) {
            data["PrimitiveDictionary"] = {};
            for (let key in primitiveDictionary_) {
                if (primitiveDictionary_.hasOwnProperty(key))
                    (data["PrimitiveDictionary"] as any)[key] = (primitiveDictionary_ as any)[key];
            }
        }

        let dateArray_: any = this.dateArray();
        if (Array.isArray(dateArray_)) {
            data["DateArray"] = [];
            for (let item of dateArray_)
                data["DateArray"].push(item.toISOString());
        }

        let dateDictionary_: any = this.dateDictionary();
        if (dateDictionary_) {
            data["DateDictionary"] = {};
            for (let key in dateDictionary_) {
                if (dateDictionary_.hasOwnProperty(key))
                    (data["DateDictionary"] as any)[key] = dateDictionary_[key] ? dateDictionary_[key].toISOString() : undefined as any;
            }
        }

        let reference_: any = this.reference();
        data["Reference"] = reference_ ? reference_.toJSON() : undefined as any;

        let array_: any = this.array();
        if (Array.isArray(array_)) {
            data["Array"] = [];
            for (let item of array_)
                data["Array"].push(item ? item.toJSON() : undefined as any);
        }

        let dictionary_: any = this.dictionary();
        if (dictionary_) {
            data["Dictionary"] = {};
            for (let key in dictionary_) {
                if (dictionary_.hasOwnProperty(key))
                    (data["Dictionary"] as any)[key] = dictionary_[key] ? dictionary_[key].toJSON() : undefined as any;
            }
        }

        return data;
    }
}