Правильное использование @typedef

Описание

У тех, кто вместо TypeScript использует JavaScript + JSDoc, нередко случаются проблемы с определением типов. К примеру interface из TypeScript можно реализовать на JSDoc вот так:

  • TypeScipt
interface Type {
    property1: number;
    property2: number;
}
  • JSDoc
/**
 * @typedef {object} Type
 * @property {number} property1
 * @property {number} property2
 */

Проблемы начинаются с наследований. И больших таких два:

Простое наследование.

Самое обычное наследование должно реализоваться с помощью каких-то дополнительных типов и костылей:

  • TypeScript
interface Base {
    baseProperty: number;
}

interface Derived extends Base {
    derivedProperty: number;
}
  • JSDoc
/**
 * @typedef {object} Base
 * @property {number} baseProperty
 */

/**
 * @typedef {object} DerivedExtension
 * @property {number} derivedProperty
 */

/**
 * @typedef {Base & DerivedExtension} Derived
 */

Наследование без изменений

Так же компилятор психует, если наследовать тип и не менять ничего в нем:

  • TypeScript
interface Base {
    property: number;
}

interface Derived extends Base { }
  • JSDoc
/**
 * @typedef {object} Base
 * @property {number} baseProperty
 */

/**
 * Этот вариант приведет к ошибке
 * @typedef {object} DerivedExtension // Получаем any
 * 
 * @typedef {Base & DerivedExtension} Derived // А тут Base & any = any
 */

/**
 * А вот это уже ?
 * @typedef {{ }} DerivedExtension // Типа пустой объект
 * 
 * @typedef {Base & DerivedExtension} Derived // А тут Base & { } = Base
 */

Хотя и второй вариант не лучший, так как вообще не показывает, что есть наследование:

Дополнительно

Я понимаю, что это не совсем наследование, но так как теги @extends или @implements не работают, у меня не остается выбора.

Вопрос

Можно как-то исправить эти костыли?
Может быть, вы знаете методы использования @typedef которые работают получше?


Ответы (2 шт):

Автор решения: SwaD

Ну так берите и наследуйте...

/**
 * @typedef {object} Base
 * @property {number} baseProperty
 */

/**
 * @typedef {Base} DerivedExtension
 * @property {number} derivedProperty
 */

Чем вам такое не подходит? введите сюда описание изображения введите сюда описание изображения

Наследование без ничего

/**
 * @typedef {Base} DerivedExtension
 */
→ Ссылка
Автор решения: nörbörnën
/**
 * @typedef {{
 *  baseProperty: number;
 * }} Base
 *
 * @typedef {Base & {
 *  derivedProperty: number;
 * }} Derived
 */
→ Ссылка