ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 5 · 2లో పాఠం 1కోర్సులో 9/14~15 min
మాడ్యూల్ పాఠాలు (1/2)

టైప్ గార్డ్స్

టైప్‌స్క్రిప్ట్‌లోని అత్యంత ముఖ్యమైన భావనలలో టైప్ సంకుచితం ఒకటి. అయితే, తరచుగా, సంక్లిష్ట అనుకూల వస్తువులకు typeof లేదా instanceof వంటి ప్రామాణిక రకం గార్డులు సరిపోవు. ఇక్కడే కస్టమ్ టైప్ గార్డ్‌లు వస్తాయి.

స్టాండర్డ్ టైప్ గార్డ్స్

ప్రామాణిక జావాస్క్రిప్ట్ ఆపరేటర్‌లను ఉపయోగించి టైప్‌స్క్రిప్ట్ రకాలను ఎలా తగ్గిస్తుంది అని సంగ్రహించడం ద్వారా ప్రారంభిద్దాం:

TS
function processInput(val: string | number) {
  if (typeof val === 'string') {
    // Here 'val' is of type string
    console.log(val.toUpperCase());
  } else {
    // Here 'val' is of type number
    console.log(val.toFixed(2));
  }
}

కస్టమ్ టైప్ గార్డ్‌లు (is ఆపరేటర్)

కస్టమ్ టైప్ గార్డ్‌ని నిర్వచించడానికి, మేము ప్రామాణిక బూలియన్ రిటర్న్ రకానికి బదులుగా parameterName is Type ఫార్మాట్‌లో రకం ప్రిడికేట్ని అందించే ఫంక్షన్‌ని సృష్టిస్తాము.

ఫంక్షన్ తప్పనిసరిగా బూలియన్ (true లేదా false)ని అందించాలి. ఇది trueని తిరిగి అందిస్తే, పాస్ చేసిన పరామితి పేర్కొన్న రకానికి చెందినదని టైప్‌స్క్రిప్ట్ తెలుసుకుంటుంది.

TS
interface Cat {
  name: string;
  meow(): void;
}

interface Dog {
  name: string;
  bark(): void;
}

// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
  return (animal as Cat).meow !== undefined;
}

function makeNoise(pet: Cat | Dog) {
  if (isCat(pet)) {
    // Here TypeScript knows 'pet' is a Cat
    pet.meow();
  } else {
    // Here TypeScript knows 'pet' is a Dog
    pet.bark();
  }
}

భద్రత మరియు కాస్టింగ్ (as vs టైప్ గార్డ్స్)

టైప్ కాస్టింగ్ (ఉదా., val as Cat) నిజమైన రన్‌టైమ్ ధృవీకరణ లేకుండానే డెవలపర్‌ను విశ్వసించేలా కంపైలర్‌ను బలవంతం చేస్తుంది. రన్‌టైమ్ ఆబ్జెక్ట్ అంచనాలను అందుకోకపోతే, కోడ్ నిశ్శబ్దంగా విఫలమవుతుంది లేదా మినహాయింపులను విసిరివేస్తుంది.

అనుకూల రకం గార్డులు, మరోవైపు, నిజమైన వేరియబుల్ రకం యొక్క టైప్‌స్క్రిప్ట్ కంపైలర్‌కు సురక్షితంగా మరియు ఖచ్చితంగా తెలియజేస్తూ, బలమైన మరియు డైనమిక్ రన్‌టైమ్ తనిఖీని నిర్వహిస్తాయి:

TS
function processInput(input: unknown) {
  // unsafe casting: could crash if input does not have the split method
  // const str = input as string;
  // console.log(str.split(' '));

  // safe guard
  if (isString(input)) {
    console.log(input.split(' ')); // 100% Safe!
  }
}

మీరే ప్రయత్నించండి

వ్యాయామం 1: స్ట్రింగ్ టైప్ గార్డ్

వ్యాయామం#ts.m5.l1.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

తెలియని విలువ స్ట్రింగ్ కాదా అని ధృవీకరించడానికి కస్టమ్ టైప్ గార్డ్‌గా పనిచేసే isString అనే సాధారణ ఫంక్షన్‌ను సృష్టించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఫంక్షన్ యొక్క రిటర్న్ రకం తప్పనిసరిగా val ఈజ్ స్ట్రింగ్ అయి ఉండాలి మరియు ఇది 'స్ట్రింగ్'కి సమానం కాదా అని తనిఖీ చేయడానికి మీరు typeofని ఉపయోగించాలి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 2: ప్రీమియం యూజర్ టైప్ గార్డ్

వ్యాయామం#ts.m5.l1.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

వినియోగదారు మరియు ప్రీమియం వినియోగదారు రకాలను బట్టి, ప్రీమియం యూజర్ (యూజర్: యూజర్) అనే టైప్ గార్డ్ ఫంక్షన్‌ను వ్రాయండి: వినియోగదారు ప్రీమియం యూజర్, ఇది వినియోగదారుకు 'ప్రీమియం' పాత్ర ఉందో లేదో తనిఖీ చేస్తుంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

సంతకాన్ని ఫంక్షన్ isPremiumUser (యూజర్: యూజర్)గా నిర్వచించండి: వినియోగదారు ప్రీమియం యూజర్ మరియు user.roleని ​​'ప్రీమియం'తో సరిపోల్చండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 3: కస్టమ్ ఎర్రర్ ఆబ్జెక్ట్ ధ్రువీకరణ

వ్యాయామం#ts.m5.l1.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

isCustomError (తప్పు: తెలియదు): err అనేది CustomError ఫంక్షన్, ఇది తెలియని విలువ 'కోడ్' కీని కలిగి ఉన్న శూన్య కస్టమ్ ఎర్రర్ ఆబ్జెక్ట్ కాదా అని ధృవీకరిస్తుంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

టైప్ ఆఫ్ ఎర్రర్ 'ఆబ్జెక్ట్' అయితే శూన్యం కాదా అని మొదట తనిఖీ చేయండి, ఆపై 'కోడ్' ప్రాపర్టీ కోసం తనిఖీ చేయడానికి 'ఇన్' ఆపరేటర్‌ని ఉపయోగించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 4: అడ్మిన్ టైప్ గార్డ్

వ్యాయామం#ts.m5.l1.e4
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

యూజర్ (ప్రాపర్టీ రోల్‌తో: స్ట్రింగ్‌తో) మరియు అడ్మిన్ (వినియోగదారుని విస్తరించడం మరియు ప్రాపర్టీ అడ్మిన్‌టోకెన్: స్ట్రింగ్) అనే రెండు ఇంటర్‌ఫేస్‌లు ఇచ్చినట్లయితే, isAdmin అనే టైప్ గార్డ్ ఫంక్షన్‌ను వ్రాయండి, అది టైప్ యూజర్‌ని అంగీకరించి, అడ్మిన్ అనే టైప్ ప్రిడికేట్ యూజర్‌ను అందిస్తుంది. వినియోగదారు పాత్ర 'అడ్మిన్'కి సమానంగా ఉందో లేదో గార్డు తప్పనిసరిగా తనిఖీ చేయాలి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

సంతకాన్ని ఫంక్షన్ isAdmin (యూజర్: యూజర్)గా నిర్వచించండి: వినియోగదారు అడ్మిన్ మరియు user.role === 'admin' అని తనిఖీ చేయండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది