JSDoc - własności obiektu w obiekcie?

0

Cześć, ostatnio bawię się trochę obiektami w JS i mam problem z podpowiedziami w IDE co do zagnieżdżonych obiektów w obiekcie, choć funkcjonalnie wydaje mi się że działa wszystko dobrze.

var result = Service.Response.UserData(resObj);

czyli jak wpiszę result. to mi podpowiada że zawiera własności "timezone" i "account_data" i w przypadku tego drugiego wiem że jest to obiekt Service.Types.AccountData. Ale kiedy wybiorę własność result.account_data. to mi już dla niej nie podpowiada jakie ma własności. Ale kiedy jej użyję np tak result.account_data.id to mimo że nie podpowiada w IDE składni to wyświetli mi identyfikator użytkownika.

Poniżej fragment kodu. I pytanie co robię źle ?

Przykład 1

var Service = { 
//...
	Response : {
		/**
		 * User Data Response
		 *
		 * @param {type} obj
		 * @returns {Service.Types.UserData}
		 */
		UserData : function(obj) {
			var result = Service.Types.UserData;
			result.timezone = obj.timezone;
			result.account_data = Service.Response.AccountData(obj.account_data);
			return result;
		},

		/**
		 * Account Data Response
		 *
		 * @param {type} obj
		 * @returns {Service.Types.AccountData}
		 */
		AccountData : function(obj) {
			var result = Service.Types.AccountData;
			result.id = obj.id;
			result.name = obj.name;
			result.email = obj.email;
			return result;
		}
	},
	Types : {
		AccountData : {
			/** @type integer*/
			id:0,
			/** @type string*/
			name:'',
			/** @type string*/
			email:'',
		},
		UserData : {
			/** @type {Service.Types.AccountData} */
			account_data:null,
			/** @type integer */
			timezone:0
		}
	}
};

Przykład 2
Próbowałem to robić jeszcze tak, tylko w tym przypadku wcale nie uzyskuje listy własności nawet w przypadku UserData, przypuszczam że dlatego że pewnie trzeba użyć @property i je zdefiniować, tylko nie wiem gdzie.

//...
		Response : {
		/**
		 *
		 * @param {type} obj
		 * @returns {Service.Types.UserData}
		 */
		UserData : function(obj) {
			return new Service.Types.UserData(obj);
		},

		/**
		 *
		 * @param {type} obj
		 * @returns {Service.Types.AccountData}
		 */
		AccountData : function(obj) {
			return new Service.Types.AccountData(obj);
		}
	},

	Types : {
		/**
		 *
		 * @param {type} obj
		 * @returns {Service.Types.UserData}
		 */
		UserData : function(obj) {
			this.timezone = obj.timezone;
			this.account_data = new Service.Types.AccountData(obj.account_data);
		},
		/**
		 *
		 * @param {type} obj
		 * @returns {Service.Types.AccountData}
		 */
		AccountData : function(obj) {
			this.id = obj.id;
			this.name = obj.name;
			this.email = obj.email;
		}
	}
};
0

Na zasadzie prób i błędów, znalazłem rozwiązanie w/w problemu.
Musiałem zdefiniować prze @typedef, że *UserData *i *AccountData *są obiektami a następnie poprzez @property zdefiniować ich własności. Troszkę uprościło mi to przy okazji kod.

Musiałem też zmienic formę wywołania:

var result = new Service.Response.UserData(resObj);

I teraz używając result., otrzymuje podpowiedzi w IDE jak i result.account_data.

//...
	Response : {
		/**
		 * User Data
		 *
		 * @param {Object} obj
		 * @typedef {Object} Service.Response.UserData
		 * @property {String} timezone Timezone
		 * @property {Service.Response.AccountData} account_data Account Data
		 * @returns {Service.Response.UserData}
		 */
		UserData : function(obj) {
			this.timezone = obj.timezone;
			this.account_data = new Service.Response.AccountData(obj.account_data);
		},
		/**
		 * Account Data
		 *
		 * @param {Object} obj
		 * @typedef {Object} Service.Response.AccountData
		 * @property {?Number} id User Identyficator
		 * @property {String} name NickName
		 * @property {String} email Email
		 * @returns {Service.Response.AccountData}
		 */
		AccountData : function(obj) {
			this.id = obj.id;
			this.name = obj.name;
			this.email = obj.email;
		}
	},
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1