function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
Використовуючи предикат типу "test is string" у наведеному вище форматі (замість того, щоб просто використовувати boolean для типу return, після виклику isString (), якщо функція повертає true, TypeScript звузить тип до рядка в будь-якому блоці, що охороняється виклик функції.
Компілятор подумає, що foo є рядком у блоці, що охороняється нижче (і ТІЛЬКИ в блоці, що охороняється нижче)
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
Присудок типу просто використовується під час компіляції. Результат .js-файл (час виконання) не матиме різниці, оскільки він не враховує ТИП.
Я проілюструю відмінності нижче на чотирьох прикладах.
Напр. 1: у наведеному вище прикладі коду не буде помилок компіляції та помилок виконання.
Напр. 2: наведений нижче приклад коду матиме помилку компіляції (а також помилку виконання), оскільки TypeScript звузив тип до рядка та перевірив, що toExponential не належить до рядкового методу.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Напр. 3: наведений нижче приклад коду не має помилки компіляції, але матиме помилку виконання, оскільки TypeScript ТІЛЬКИ звузить тип до рядка в блоці, що охороняється, але не після, тому foo.toExponential не створить помилку компіляції (TypeScript не вважає, що це так тип рядка). Однак під час виконання рядок не має методу toExponential, тому він матиме помилку виконання.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
Напр. 4: якщо ми не використовуємо "test is string" (предикат типу), TypeScript не буде звужувати тип у блоці, що охороняється, і наведений нижче приклад коду не матиме помилки компіляції, але матиме помилку виконання.
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Висновок полягає в тому, що "тест - це рядок" (предикат типу) використовується під час компіляції, щоб повідомити розробникам, що у коду буде можливість помилки виконання. Щодо javascript, розробники не знатимуть про помилку під час компіляції. Це перевага використання TypeScript.
booleanправильно?