Приведение типа класса и вызов свойства stati c - PullRequest
0 голосов
/ 07 марта 2020

Я работаю в проекте javascript, использующем проверку jsdoc / typescript и испытываем проблемы с приведением типа, а затем использую свойство stati c.

Когда используя импортированный тип у меня есть следующая проблема:

// @ts-check -- foo.js
export default class Foo {
    static bar() {}
}

// @ts-check -- bar.js

/** @typedef {import('./foo').default} Foo */

const HopefullyFoo = /** @type {unknown} */ ('Foo');

const foo = /** @type {typeof Foo} */ (HopefullyFoo);

foo.bar();

Вывод:

src/components/bar.js:7:31 - error TS2693: 'Foo' only refers to a type, but is being used as a value here.

7 const foo = /** @type {typeof Foo} */ (HopefullyFoo);
                                ~~~

Если я помещаю все в один файл, это выглядит нормально:

// @ts-check

class Foo {
    static bar() {}
}

const LikelyFoo = /** @type {unknown} */ ('Foo');

const foo = /** @type {typeof Foo} */ (LikelyFoo);

foo.bar();

// No errors

Если я не произвожу typeof, я получаю эту ошибку, поэтому я тоже не думаю, что это правильно.

// @ts-check

class Foo {
    static bar() {

    }
}

const LikelyFoo = Foo;

const foo = /** @type {Foo} */ (LikelyFoo);

foo.bar();

Вывод

src/components/foo.js:13:5 - error TS2576: Property 'bar' is a static member of type 'Foo'

13 foo.bar();
       ~~~

Возможно ли это?

1 Ответ

2 голосов
/ 07 марта 2020

Тип класса - это тип, который будет иметь объект, созданный конструктором этого класса. Этот тип содержит только поля уровня экземпляра, поэтому вы правильно используете оператор typeof. Проблема в том, что оператор не может быть применен к типу, ему нужно значение. В случае обычного импорта

import Foo from "./foo";

вы получаете как тип, так и значение (конструктор), но в случае импорта jsdo c вы получаете только тип. Поэтому, если вы по какой-то причине не можете импортировать реальное значение, вы можете добавить псевдоним для typeof Foo рядом с определением класса:

foo. js

// @ts-check -- foo.js
export default class Foo {
  static bar() {}
}
/** @typedef {typeof Foo} FooCtor */

и использовать его затем

// @ts-check -- bar.js

/** @typedef {import('./foo').FooCtor} FooCtor */

const HopefullyFoo = /** @type {unknown} */ ('Foo');

const foo = /** @type {FooCtor} */ (HopefullyFoo);

foo.bar();

PS: tbh, я никогда не видел, чтобы TS использовал таким образом, поэтому я могу ошибаться.

...