Тип защиты
Защита типов позволяет использовать меньшие типы объектов.
typeof
TypeScript знаком с использованием операторов instanceof и typeof в JavaScript. Если вы используете их в блоке условий, TypeScript выведет типы переменных в блоке условий. Как показано в следующем примере, TypeScript распознает, существует ли конкретная функция в строке и произошла ли опечатка:
function doSome(x: number | string) {
if (typeof x === 'string') {
// В этом блоке TypeScript знает, что переменная `x` должена быть string
console.log(x.subtr(1)); // Error: метод 'subtr' не существует у `string`
console.log(x.substr(1)); // ok
}
x.substr(1); // Error: Нет гарантии, что `x` имеет тип string
}instanceof
Вот пример c class и 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
}
}
doStuff(new Foo());
doStuff(new Bar());TypeScript может даже понять else. Когда вы используете if для сужения типов, TypeScript знает, что типы в других блоках не являются типами в if:
in
Оператор in может безопасно проверить наличие атрибута на объекте, а также обычно используется для защиты типов:
Защита литерального типа
Когда вы используете литеральные типы в типах объединения, вы можете проверить, отличаются ли они:
null и undefined с strictNullChecks
strictNullChecksTypeScript достаточно умен, чтобы исключить как null, так и undefined с помощью проверки == null / != null. Например:
Использовать защиту определенного типа
В JavaScript нет очень богатого встроенного механизма самоконтроля во время выполнения. Когда вы используете обычные объекты JavaScript (и используете структурные типы, это более выгодно), вы даже не можете получить доступ к instanceof и typeof. В этом сценарии вы можете создать пользовательскую функцию защиты типа, которая является просто функцией, которая возвращает значение, аналогичное someArgumentName is SomeType, следующим образом:
Last updated
Was this helpful?