Поиск…


Синтаксис

  • typeof x === "имя типа"
  • x instanceof ТипName
  • function (foo: any): foo is TypeName {/ * code return boolean * /}

замечания

Использование аннотаций типа в TypeScript ограничивает возможные типы, с которыми вам придется иметь дело с кодом, но по-прежнему часто требуется использовать разные пути кода на основе типа среды выполнения.

Типовые защитные устройства позволяют писать код, который различает в зависимости от типа среды выполнения переменной, оставаясь строго типизированным и избегая приведения (также известного как утверждения типа).

Использование instanceof

instanceof требует, чтобы переменная имела тип any .

Этот код ( попробуйте ):

class Pet { }
class Dog extends Pet {
    bark() {
        console.log("woof");
    }
}
class Cat extends Pet {
    purr() {
        console.log("meow");
    }
}

function example(foo: any) {
    if (foo instanceof Dog) {
        // foo is type Dog in this block
        foo.bark();
    }

    if (foo instanceof Cat) {
        // foo is type Cat in this block
        foo.purr();
    }
}

example(new Dog());
example(new Cat());

печать

woof
meom

на консоль.

Использование typeof

typeof используется, когда вам нужно различать number типов, string , boolean и symbol . Другие строковые константы не будут ошибочными, но также не будут использоваться для сужения типов.

В отличие от instanceof , typeof будет работать с переменной любого типа. В приведенном ниже примере foo можно ввести как number | string без проблем.

Этот код ( попробуйте ):

function example(foo: any) {
    if (typeof foo === "number") {
        // foo is type number in this block
        console.log(foo + 100);
    }

    if (typeof foo === "string") {
        // fooi is type string in this block
        console.log("not a number: " + foo);
    }
}

example(23);
example("foo");

печать

123
not a number: foo

Защитные функции типа

Вы можете объявлять функции, которые служат в качестве охранников типов, используя любую логику, которую вы хотите.

Они принимают форму:

function functionName(variableName: any): variableName is DesiredType {
    // body that returns boolean
}

Если функция возвращает true, TypeScript будет сузить тип до DesiredType в любом блоке, защищенном вызовом функции.

Например ( попробуйте ):

function isString(test: any): test is string {
    return typeof test === "string";
}

function example(foo: any) {
    if (isString(foo)) {
        // foo is type as a string in this block
        console.log("it's a string: " + foo);
    } else {
        // foo is type any in this block
        console.log("don't know what this is! [" + foo + "]");
    }
}

example("hello world");          // prints "it's a string: hello world"
example({ something: "else" });  // prints "don't know what this is! [[object Object]]"

Предикат типа функции защиты ( foo is Bar в позиции возвращаемого типа функции) используется во время компиляции для узких типов, тело функции используется во время выполнения. Предикат и функция типа должны соглашаться, или ваш код не будет работать.

Функции защиты типа не должны использовать typeof или instanceof , они могут использовать более сложную логику.

Например, этот код определяет, есть ли у вас объект jQuery, проверяя его версию.

function isJQuery(foo): foo is JQuery {
    // test for jQuery's version string
    return foo.jquery !== undefined;
}

function example(foo) {
    if (isJQuery(foo)) {
        // foo is typed JQuery here
        foo.eq(0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow