TypeScript
Пользовательские типы гвардейцев
Поиск…
Синтаксис
- 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);
}
}