Spec-Zone.ru › Flow

Строгие правила линтера для импорта и экспорта модулей ES

Эти правила линтера обеспечивают более строгое использование синтаксиса import и export модулей ES. Для всех них требуется, чтобы в .flowconfig была включена опция experimental.strict_es6_import_export со значением true.

default-import-access​

Срабатывает, если вы обращаетесь к экспорту default модуля косвенно, а не импортируете его напрямую. Это включает доступ к свойству default объекта пространства имён import * (через обращение к члену или деструктуризацию), а также использование синтаксиса import { default as ... }.

Обращение к default через доступ к члену при импорте пространства имён:

import * as Foo from './foo';

Foo.default; // Error
Foo['default']; // Error

Деструктуризация default из импорта пространства имён, в том числе в объявлениях и присваиваниях переменных:

import * as Foo from './foo';

const {default: renamed1} = Foo; // Error
const {'default': renamed2} = Foo; // Error

let x;
({default: x} = Foo); // Error
({'default': x} = Foo); // Error

Использование default при деструктуризации импорта:

import {default as renamed} from './foo'; // Error

Вместо этого импортируйте экспорт по умолчанию напрямую:

import Foo from './foo'; // Ok

export-renamed-default​

Срабатывает, если экспорт по умолчанию модуля задаётся путём переименования именованного экспорта в default в спецификаторе экспорта вместо прямого использования export default. Это относится как к локальным экспортам, так и к реэкспортам.

Переименование локальной привязки в default в спецификаторе экспорта:

class Foo {}

export {Foo as default}; // Error

Вместо этого используйте непосредственно export default:

class Foo {}

export default Foo; // Ok

Реэкспорт именованного экспорта как default:

export {named1 as default} from './foo'; // Error

Реэкспорт свойства default из другого модуля:

export {default} from './foo'; // Error

При реэкспорте сначала import значение, а затем используйте export default:

import {named1} from './foo';
export default named1; // Ok

invalid-import-star-use​

Срабатывает, если объект пространства имён import * используется не для обращения к одному из его именованных экспортов. Объект пространства имён можно использовать только для доступа к члену (например, Foo.bar), доступа к члену со строковым литералом (например, Foo['bar']) или простой деструктуризации (например, const {bar} = Foo).

Нельзя использовать объект пространства имён непосредственно как значение, вызывать его или передавать:

import * as Utils from './utils';

const copy = Utils; // Error
Utils(); // Error

Нельзя использовать объект пространства имён в позиции типа без квалификатора или с неквалифицированным typeof:

import * as Utils from './utils';

type T = Utils; // Error
type U = typeof Utils; // Error

Квалифицированный доступ к типу и квалифицированный typeof разрешены:

import * as Utils from './utils';

type T = Utils.SomeType; // Ok
type U = typeof Utils.someValue; // Ok

Деструктуризация с элементами rest или вычисляемыми свойствами запрещена, поскольку такие шаблоны не обращаются к конкретным именованным экспортам:

import * as Utils from './utils';

const {foo, ...rest} = Utils; // Error
const {foo, [expr]: computed} = Utils; // Error

Простая деструктуризация с известными именами свойств разрешена:

import * as Utils from './utils';

const {greeting, count} = Utils; // Ok
const {'greeting': renamed} = Utils; // Ok

mixed-import-and-require​

Срабатывает, если в файле на верхнем уровне используются операторы import модулей ES и вызовы require CommonJS. Смешение этих двух модульных систем в одном файле может привести к неоднозначной семантике и проблемам взаимодействия. Используйте в каждом файле только один стиль.

Одновременное использование import и require в одном файле:

import {named1} from './foo';

const {named2} = require('./foo'); // Error

Ошибка указывает на вызов require и ссылается на оператор import. Независимо от количества операторов import или require сообщается только о первом из каждого вида.

Доступ к члену у вызова require также вызывает срабатывание правила линтера:

import {named1} from './foo';

const named2 = require('./foo').named2; // Error

Импорты только для типов (с использованием import type или import typeof) не считаются импортами значений и не вызывают срабатывание этого правила линтера при сочетании с require:

import type {MyType} from './foo';
import typeof {MyClass} from './foo';

const Foo = require('./foo'); // Ok

Чтобы исправить ошибку, последовательно используйте одну модульную систему. Предпочтительно использовать операторы import модулей ES:

import {named1} from './foo';
import {named2} from './foo'; // Ok

non-const-var-export​

Срабатывает, если экспортируется переменная, объявленная с помощью var или let. Экспортируемые переменные следует объявлять с помощью const, чтобы предотвратить их переназначение после экспорта, которое может привести к непредсказуемому поведению в разных модулях.

Непосредственный экспорт объявления let или var:

export let count: number = 0; // Error
export var name: string = 'foo'; // Error

export const MAX: number = 100; // Ok

Экспорт переменных let или var через спецификаторы экспорта:

let count: number = 0;
var name: string = 'foo';
const MAX: number = 100;

export {count, name}; // Error on `count` and `name`
export {MAX}; // Ok

Чтобы исправить ошибку, измените объявление переменной на const:

export const count: number = 0; // Ok
export const name: string = 'foo'; // Ok

this-in-exported-function​

Срабатывает, если в экспортируемой функции используется this без аннотации параметра this. Без аннотации this привязка this неизвестна, что может привести к неожиданному поведению при вызове функции из другого модуля.

Использование this в непосредственно экспортируемом объявлении функции:

export function greet() {
  return this.name; // Error
}

Использование this в экспортируемых функциональных выражениях и стрелочных функциях:

export const greet = function() {
  return this.name; // Error
};

export const greetArrow = () => {
  return this.name; // Error
};

Использование this в функции, экспортируемой через спецификатор экспорта:

function greet() {
  return this.name; // Error
}

export { greet };

Использование this в функции, экспортируемой по умолчанию:

export default function() {
  return this.name; // Error
}

Чтобы исправить ошибку, добавьте к функции аннотацию параметра this, явно задающую ожидаемый тип this:

export function greet(this: {name: string}) {
  return this.name; // Ok
}

Обратите внимание: использование this во вложенных объявлениях функций, функциональных выражениях или телах классов внутри экспортируемой функции не вызывает срабатывание этого правила линтера, поскольку у них есть собственная привязка this:

export function outer() {
  // `this` inside a nested function does not trigger the lint
  function inner() {
    this; // Ok (not flagged by this lint)
  }

  // `this` inside a class body does not trigger the lint
  class C {
    method() {
      this; // Ok
    }
  }
}

См. также​

  • .flowconfig [options] — параметр experimental.strict_es6_import_export, включающий эти правила

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/linting/strict-import-export-lints

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API