Есть ли смысл выполнять «тип импорта» вместо «импорт» с помощью Flow? - PullRequest
0 голосов
/ 21 мая 2018

Flow позволяет использовать следующий синтаксис для импорта типов:

// SomeClass.js
export default class SomeClass {}

// SomeFile.js
import type SomeClass from './SomeClass';

В чем преимущество использования import type вместо import?Сообщает ли Flow больше информации и позволяет ли он лучше выполнять статический анализ?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Для конкретного случая классов будет работать любой из этих примеров.Ключевым моментом является то, что он ломается следующим образом:

  • import type ... from импортирует тип потока
  • import ... from, импортирует стандартное значение JS и тип этого значения.

Класс JS создает значение, но Flowtype также интерпретирует объявление класса как объявление типа, поэтому оно оба .

Так где import typeважный?

  1. Если импортируемая вещь не имеет значения, использование импорта значений в некоторых случаях будет интерпретироваться как ошибка, поскольку большинство инструментов JS не знают, что существует Flow.Например,
    • export type Foo = { prop: number }; может иметь значение только с import type { Foo } from ..., поскольку значение с именем Foo
  2. Если вещьвы импортируете, имеет значение JS, но все, что вам нужно, это тип
    • . Импорт только типа может сделать код более читабельным, так как из импорта ясно, что используется только тип, поэтому ничего вНапример, файл может создать новый экземпляр этого класса.
    • Иногда импорт только типа позволяет избежать циклов зависимости в ваших файлах.В зависимости от того, как написан код, иногда может иметь значение, в каком порядке импортируются объекты. Поскольку import type ... влияет только на проверку типов, а не на поведение во время выполнения, вы можете импортировать тип, фактически не требуя выполнения импортированного файла, избегая потенциальных циклов.
0 голосов
/ 21 мая 2018

Как указано в этой ссылке

С типом импорта вы хотите импортировать тип класса, а не сам класс.

Пример, приведенный по той же ссылке, что и ниже

// @flow

// Post-transformation lint error: Unused variable 'URI'
import URI from "URI";

// But if you delete the require you get a Flow error:
// identifier URI - Unknown global name
module.exports = function(x: URI): URI {
  return x;
}

Поскольку мы импортировали URI в этот компонент, linter проверит, использовали ли мы класс в этом компоненте.Однако мы используем его только для проверки типа потока и, следовательно, linter выдаст ошибку о том, что мы импортировали неиспользованную переменную.

...