Какое правильное определение машинописи для конкретного шаблона создания javascript - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я работаю над 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)), и моя цель состоит в том, чтобыдокументируйте их отдельно.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Поскольку вы работаете с подклассами. Важно сохранять чистоту и лаконичность.Как написано выше, вы можете видеть, что собака была создана как животное, но у нее нет никаких отличий, кроме как с животнымВ некоторых случаях есть некоторые переменные или методы, которые переопределяются.При этом, я считаю, что было бы лучше, если бы вы реализовали что-то похожее на:

class Animal {
  constructor(){}
  communicate() { return "Makes Noise"; }
}

class Dog extends Animal {
  constructor(){
    super();
  }

  communicate() { return "Barks"; }
}

, оттуда вы можете переопределить методы или переменные для того, чтобы правильно отличить Dog от Animal от других подклассов Animal.

0 голосов
/ 19 ноября 2018

Что-то вроде этого:

declare class Animal
{
    constructor ( type )
    static Dog : (new () => Animal)
}

Редактировать

Поскольку имеются перегруженные конструкторы, набор текста немного отличается:

declare class Animal
{
    constructor ( type )
    static Dog : (new () => Animal) & (new (color) => Animal)
}
...