Правильное использование @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 шт):
Ну так берите и наследуйте...
/**
* @typedef {object} Base
* @property {number} baseProperty
*/
/**
* @typedef {Base} DerivedExtension
* @property {number} derivedProperty
*/
Наследование без ничего
/**
* @typedef {Base} DerivedExtension
*/
/**
* @typedef {{
* baseProperty: number;
* }} Base
*
* @typedef {Base & {
* derivedProperty: number;
* }} Derived
*/