Type Guard
Type Guard
Захисники типу дозволяють звузити тип об’єкта в межах умовного блоку.
typeof
TypeScript знає про використання операторів instanceof і typeof JavaScript. Якщо ви використовуєте їх в умовному блоці, TypeScript зрозуміє, що тип змінної буде іншим у цьому умовному блоці. Ось короткий приклад, коли TypeScript розуміє, що певна функція не існує в string, і вказує на те, що, ймовірно, було помилкою користувача:
function doSomething(x: number | string) {
if (typeof x === 'string') { // Within the block TypeScript knows that `x` must be a string
console.log(x.subtr(1)); // Error, 'subtr' does not exist on `string`
console.log(x.substr(1)); // OK
}
x.substr(1); // Error: There is no guarantee that `x` is a `string`
}instanceof
Ось приклад із класом і instanceof:
class Foo {
foo = 123;
common = '123';
}
class Bar {
bar = 123;
common = '123';
}
function doStuff(arg: Foo | Bar) {
if (arg instanceof Foo) {
console.log(arg.foo); // OK
console.log(arg.bar); // Error!
}
if (arg instanceof Bar) {
console.log(arg.foo); // Error!
console.log(arg.bar); // OK
}
console.log(arg.common); // OK
console.log(arg.foo); // Error!
console.log(arg.bar); // Error!
}
doStuff(new Foo());
doStuff(new Bar());TypeScript навіть розуміє else, тому, коли if звужує один тип, він знає, що всередині else it's definitely not that type. Ось приклад:
in
Оператор in виконує безпечну перевірку наявності властивості об'єкта та може використовуватися як захист типу. наприклад
Literal Type Guard
Ви можете використовувати === / == / !== / !=, щоб розрізняти літеральні значення
Це навіть працює, коли у вас є буквальні типи в об’єднанні. Ви можете перевірити значення назви спільної властивості, щоб розрізнити об’єднання, наприклад.
null and undefined with strictNullChecks
strictNullChecksTypeScript достатньо розумний, щоб виключити як null, так і undefined за допомогою перевірки == null / != null. Наприклад:
User Defined Type Guards
У JavaScript не надто багато вбудованої підтримки інтроспекції під час виконання. Коли ви використовуєте звичайні об’єкти JavaScript (використовуючи структурну типізацію для вашої переваги), ви навіть не маєте доступу до instanceof або typeof. Для цих випадків ви можете створити User Defined Type Guard functions. Це лише функції, які повертають someArgumentName is SomeType. Ось приклад:
Type Guards and callbacks
TypeScript не передбачає, що guards залишаються активними у зворотних викликах, оскільки робити це припущення небезпечно.
Виправити це так само просто, як зберегти виведене безпечне значення в локальній змінній, автоматично гарантуючи, що воно не буде змінено ззовні, і TypeScript може легко зрозуміти, що:
Last updated