Строгие правила линтера для импорта и экспорта модулей 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