Я наткнулся на код, который выглядит примерно так:

export function foo(arg: string): arg is MyType {
    return ...
}

Мне не удалось найти is ни в документах, ни в Google, это довольно распространенное слово, которое встречается практически на каждой странице.

Что ключевое слово делает в этом контексте?

Drew

Ответов: 2

Ответы (2)

Дополнительные сведения см. В справке по функциям защиты определяемого пользователем типа.

функция isString (test: any): test is string {
    return typeof test === "строка";
}

пример функции (foo: any) {
    if (isString (foo)) {
        console.log («это строка» + foo);
        console.log (foo.length); // строковая функция
    }
}
пример ("привет мир");

Использование предиката типа test is string в указанном выше формате (вместо простого использования boolean для типа возвращаемого значения), после того, как вызывается isString () , если функция возвращает true, TypeScript сузит тип до string в любом блоке, охраняемом вызовом функции. Компилятор будет думать, что foo равно string в блоке, защищенном снизу (и ТОЛЬКО в блоке, защищенном снизу)

{
    console.log («это строка» + foo);
    console.log (foo.length); // строковая функция
}

Предикат типа используется только во время компиляции. Результирующий файл .js (время выполнения) не будет иметь разницы, потому что он не учитывает ТИП.

Я проиллюстрирую различия на следующих четырех примерах.

Например, 1: в приведенном выше примере кода не будет ни ошибки компиляции, ни ошибки времени выполнения.

Например, 2: в приведенном ниже примере кода будет ошибка компиляции (а также ошибка времени выполнения), потому что TypeScript сузил тип до string и проверил, что toExponential не принадлежит string метод.

пример функции (foo: any) {
    if (isString (foo)) {
        console.log («это строка» + foo);
        console.log (foo.length);
        console.log (foo.toExponential (2));
    }
}

Например. 3: в приведенном ниже примере кода нет ошибки компиляции, но будет ошибка времени выполнения, потому что TypeScript ТОЛЬКО сузит тип до string в блоке, который охраняется, но не после, поэтому foo.toExponential будет не создавать ошибку компиляции (TypeScript не считает, что это тип string). Однако во время выполнения строка не имеет метода toExponential, поэтому она будет иметь ошибку времени выполнения.

пример функции (foo: any) {
    if (isString (foo)) {
        console.log («это строка» + foo);
        console.log (foo.length);
    }
    console.log (foo.toExponential (2));
}

Например. 4: если мы не используем test is string (предикат типа), TypeScript не будет сужать тип в охраняемом блоке, и в приведенном ниже примере кода не будет ошибки компиляции, но будет ошибка времени выполнения.

function isString (test: any): boolean {
    return typeof test === "строка";
}
пример функции (foo: any) {
    if (isString (foo)) {
        console.log («это строка» + foo);
        console.log (foo.length);
        console.log (foo.toExponential (2));
    }
}

Вывод таков: test is string (предикат типа) используется во время компиляции, чтобы сообщить разработчикам, что код может иметь ошибку времени выполнения. Для javascript разработчики НЕ ЗНАЮТ ошибку во время компиляции. В этом преимущество использования TypeScript.

Единственное использование, которое я знаю, - это один из вашего примера: указание «предиката типа» (arg - MyType) в определяемом пользователем Type Guard

См. Описанные пользователем защитные ограждения в этой справке

Вот еще ссылка

2022 WebDevInsider