Пропустить до содержимого

Анализ потока управления

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

До TypeScript 4.4 анализ потока управления применялся только к коду внутри инструкции if, но начиная с TypeScript 4.4 он также может применяться к условным выражениям и доступу к дискриминирующим свойствам, на которые косвенно ссылаются через переменные const.

Например:

const f1 = (x: unknown) => {
const isString = typeof x === 'string';
if (isString) {
x.length;
}
};
const f2 = (
obj: { kind: 'foo'; foo: string } | { kind: 'bar'; bar: number }
) => {
const isFoo = obj.kind === 'foo';
if (isFoo) {
obj.foo;
} else {
obj.bar;
}
};

Несколько примеров, в которых сужение не происходит:

const f1 = (x: unknown) => {
let isString = typeof x === 'string';
if (isString) {
x.length; // Error, no narrowing because isString it is not const
}
};
const f6 = (
obj: { kind: 'foo'; foo: string } | { kind: 'bar'; bar: number }
) => {
const isFoo = obj.kind === 'foo';
obj = obj;
if (isFoo) {
obj.foo; // Error, no narrowing because obj is assigned in function body
}
};

Примечание: в условных выражениях анализируется до пяти уровней косвенности.