Давайте рассмотрим следующий код, функцию, которая возвращает объект с двумя функциями:
/**
* Create a something
* @returns {object} Something
*/
function createSomething() {
return {
/**
* Foo!
* @returns {string}
*/
foo() { return 'foo';},
/**
* Bar!
* @returns {string}
*/
bar() { return 'bar';}
};
}
При вызове этого метода, даже если тип возвращаемого значения просто object
, IDE: как WebStormвыведите тип из возвращенного литерала, так что при наборе createSomething().
будут предложены члены foo
и bar
.100
Однако, скажем, мне нужно передать этот объект другим функциям.Чтобы эти функции могли понять, что это «что-то», я бы хотел @typedef
это, поэтому я делаю следующее:
/**
* @typedef {object} Something
*/
/**
* Create a something
* @returns {Something} Something
*/
function createSomething() {
return {
/**
* Foo!
* @returns {string}
*/
foo() { return 'foo';},
/**
* Bar!
* @returns {string}
*/
bar() { return 'bar';}
};
}
Теперь у нас есть тип для объекта, возвращаемого из createSomething()
.Однако, поскольку тип возвращаемого значения указан явно, среда IDE NOT автоматически выведет любые члены из возвращаемого значения, поэтому теперь у нас есть определенный тип без каких-либо известных членов.101
Конечно, я могу вручную ввести каждый элемент как @property
в @typedef
, например:
/**
* @typedef {object} Something
* @property {function} foo
* @property {function} bar
*/
Однако это означает необходимость синхронизации typedef вручнуювсякий раз, когда я добавляю или удаляю какие-либо элементы из объекта Something
.
я пытался поместить @typedef
чуть выше оператора return
в createSomething()
, надеясь, что это намекает JSDoc и IDE, чтоВ typedef члены определены в следующем литерале, но безрезультатно - @typedef {object}
, кажется, всегда трактуется как не имеющее других членов, кроме явно указанных @property
.
Есть ли способпозволить IDE автоматически выводить элементы из возвращенного литерала, одновременно определяя тип для возвращаемого объекта?По сути, я хочу того же, что и при использовании классов ES6 - он автоматически становится типом со всеми методами в качестве членов.