Javascript как мне документировать переменную, которая должна быть объектом определенного типа c - PullRequest
0 голосов
/ 19 июня 2020

Я использую IDE WebStorm. У меня есть несколько классов, у которых есть функции c. Например, следующее будет выводить на консоль «foo1_bar».

class Foo {
    static bar() {
        return "foo_bar";
    }
}

class Foo1 extends Foo {
    static bar() {
        return "foo1_bar";
    }
}

class Foo2 extends Foo {
    static bar() {
        return "foo2_bar";
    }
}

/**
 * @param {Object} type
 */
const test=(type)=>{
    console.log(type.bar());
}
test(Foo1);

Это работает, и IDE говорит, что это правильно, но я хочу указать, что объект, переданный для тестирования, должен иметь тип Foo. Если я помещаю Foo в {}, хотя вместо Object, он терпит неудачу. Как правильно это задокументировать?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Имя типа в аннотации @param говорит, что параметр является экземпляром соответствующего типа (т. Е. Созданным с помощью new type()), поэтому разрешаются только члены экземпляра. Вы можете попробовать использовать typeof здесь:

class Foo {
    static bar() {
        return 'foo_bar'
    }
}

/**
 * @param {typeof Foo} type
 */
const test = type => {
    console.log(type.bar()) //Unresolved function or method bar()
}
0 голосов
/ 19 июня 2020

Вы можете проверить тип type с помощью TypeScript:

Например:

'use strict';

class Foo {

    /**
     * Add property bar with no definite assignment assertion 
     * as bar is not defined in a constructor
     */ 
    bar!: typeof Foo.bar;

    static bar(): string {
        return "foo_bar";
    }
}

class Foo1 extends Foo {
    static bar(): string {
        return "foo1_bar";
    }
}

class Foo2 extends Foo {
    static bar(): string {
        return "foo2_bar";
    }
}

class Test {
    static bar(): string {
        return "foo_bar";
    }
}

class OneMore {
    static foo_bar(): string {
        return "foo_bar";
    }
}

/**
 * @param {Foo} type
 */
const test = (type: Foo): void => {
    console.log(type.bar());
}
test(Foo); // Works
test(Foo1); // Works
test(Foo2); // Works
test(Test); // Sadly works too..
test(OneMore); // Fails

Большая часть кода после остаётся как есть, за исключением установки возврата types и сообщая машинописный текст о типе вашего метода bar.

Есть один недостаток ... Как вы видите, код test(Test) компилируется правильно, даже если Test не typeof Foo. Это потому, что Test имеет ту же структуру, что и Foo, и статически совместим с Foo

Ловушка: классы работают структурно, а не номинально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...