В настоящее время я работаю над Paper.js
определением машинописного текста библиотеки и не могу найти правильный способ документировать некоторые части API.
Случай можно свести к следующему: скажем, у нас естьAnimal
класс со статическим свойством Dog
, используемый в качестве пользовательского конструктора для класса:
var Animal = function(type) {};
Animal.Dog = function() {
return new Animal('dog');
};
Экземпляр Animal
может быть построен двумя способами:
var dog = new Animal('dog');
Или:
var dog = new Animal.Dog();
В обоих случаях мне нужно, чтобы тип переменной dog
выводился как Animal
.
Сначала я попробовал:
declare class Animal
{
constructor ( type )
static Dog (): Animal
}
Но TSLint завершается ошибкой с ошибкой: «С ключевым словом« new »можно вызвать только функцию void», потому что Animal.Dog()
тип возвращаемого значения функции Animal
.
И если я установлю тип возврата Animal.Dog()
как void
:
declare class Animal
{
constructor ( type )
static Dog (): void
}
TSLint pass, но я получу void
в качестве предполагаемого типа ...
Поэтому я попробовал другой способ:
declare class Animal
{
constructor ( type )
}
declare namespace Animal
{
export class Dog extends Animal
{
constructor()
}
}
С этим, TSLint проходит, но в случае:
var dog = new Animal.Dog();
Предполагаемый тип переменной dog
равен Animal.Dog
, а не Animal
, как хотелось бы.
Это не большая проблема, потому что тип Animal.Dog
расширяет Animal
, но в библиотеке нет Animal.Dog
, поэтому я нашел этот обходной путь вводящим в заблуждениепользователь.
Кто-нибудь знает лучший способ справиться с этим делом?
Редактировать
Развивая решение @stramski, я добавляю к проблеме тот факт, что Animal.Dog
может иметь несколько подписей (например, Animal.Dog()
и Animal.Dog(color)
), и моя цель состоит в том, чтобыдокументируйте их отдельно.