[{"data":1,"prerenderedAt":1187},["ShallowReactive",2],{"page-\u002Fts\u002Funions-et-narrowing":3,"pieces-ts":1144,"autour-\u002Fts\u002Funions-et-narrowing":1169,"prerequis-\u002Fts\u002Funions-et-narrowing":1174,"plan-ts":1176},{"id":4,"title":5,"body":6,"description":1115,"extension":1116,"ligne":54,"meta":1117,"motsCles":1118,"navigation":89,"niveau":1122,"path":1123,"prerequis":1124,"ressources":1126,"seo":1135,"sources":1136,"stem":1142,"__hash__":1143},"docs\u002Fts\u002F04.unions-et-narrowing.md","Unions, littéraux et narrowing",{"type":7,"value":8,"toc":1103},"minimark",[9,14,27,31,49,128,134,138,141,196,201,205,212,303,321,325,328,390,405,427,431,438,521,524,528,531,591,598,712,716,723,882,891,904,908,917,997,1005,1047,1056,1060,1099],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,24],"ul",{},[18,19,20],"li",{},"Écrire une union et des types littéraux.",[18,22,23],{},"Restreindre un type dans le code : c'est le narrowing.",[18,25,26],{},"Modéliser des cas distincts avec une union discriminée.",[10,28,30],{"id":29},"une-valeur-plusieurs-types-possibles","Une valeur, plusieurs types possibles",[32,33,34,35,39,40,43,44,48],"p",{},"Une quantité d'ingrédient peut être un nombre (",[36,37,38],"code",{},"2",") ou un texte (",[36,41,42],{},"\"une pincée\"","). Une ",[45,46,47],"strong",{},"union"," accepte l'un ou l'autre, avec une barre verticale.",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","let quantite: number | string\n\nquantite = 2\nquantite = \"une pincée\"\nquantite = true \u002F\u002F Erreur\n","ts","",[36,57,58,84,91,103,114],{"__ignoreMap":55},[59,60,63,67,71,74,78,81],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"sOnC1","let",[59,68,70],{"class":69},"scfrF"," quantite",[59,72,73],{"class":65},":",[59,75,77],{"class":76},"s5iOY"," number",[59,79,80],{"class":65}," |",[59,82,83],{"class":76}," string\n",[59,85,87],{"class":61,"line":86},2,[59,88,90],{"emptyLinePlaceholder":89},true,"\n",[59,92,94,97,100],{"class":61,"line":93},3,[59,95,96],{"class":69},"quantite ",[59,98,99],{"class":65},"=",[59,101,102],{"class":76}," 2\n",[59,104,106,108,110],{"class":61,"line":105},4,[59,107,96],{"class":69},[59,109,99],{"class":65},[59,111,113],{"class":112},"shWOn"," \"une pincée\"\n",[59,115,117,119,121,124],{"class":61,"line":116},5,[59,118,96],{"class":69},[59,120,99],{"class":65},[59,122,123],{"class":76}," true",[59,125,127],{"class":126},"sd6ml"," \u002F\u002F Erreur\n",[32,129,130,133],{},[36,131,132],{},"number | string"," se lit « un nombre ou un texte ». Toute autre valeur est refusée.",[10,135,137],{"id":136},"le-problème-lunion-limite-les-actions","Le problème : l'union limite les actions",[32,139,140],{},"Avec une union, TypeScript n'autorise que ce qui marche pour tous les types possibles.",[50,142,144],{"className":52,"code":143,"language":54,"meta":55,"style":55},"function afficher(quantite: number | string) {\n  return quantite.toUpperCase() \u002F\u002F Erreur\n}\n",[36,145,146,174,191],{"__ignoreMap":55},[59,147,148,151,155,158,162,164,166,168,171],{"class":61,"line":62},[59,149,150],{"class":65},"function",[59,152,154],{"class":153},"syCW7"," afficher",[59,156,157],{"class":69},"(",[59,159,161],{"class":160},"sIXEE","quantite",[59,163,73],{"class":65},[59,165,77],{"class":76},[59,167,80],{"class":65},[59,169,170],{"class":76}," string",[59,172,173],{"class":69},") {\n",[59,175,176,179,182,185,188],{"class":61,"line":86},[59,177,178],{"class":65},"  return",[59,180,181],{"class":69}," quantite.",[59,183,184],{"class":153},"toUpperCase",[59,186,187],{"class":69},"() ",[59,189,190],{"class":126},"\u002F\u002F Erreur\n",[59,192,193],{"class":61,"line":93},[59,194,195],{"class":69},"}\n",[32,197,198,200],{},[36,199,184],{}," existe pour un texte, pas pour un nombre. TypeScript refuse, car il ne sait pas lequel des deux tu as reçu.",[10,202,204],{"id":203},"le-narrowing-avec-typeof","Le narrowing avec typeof",[32,206,207,208,211],{},"Le ",[45,209,210],{},"narrowing"," (en français, rétrécissement) consiste à vérifier le type dans le code. TypeScript le comprend et restreint le type dans le bloc concerné.",[50,213,215],{"className":52,"code":214,"language":54,"meta":55,"style":55},"function afficher(quantite: number | string) {\n  if (typeof quantite === \"string\") {\n    return quantite.toUpperCase() \u002F\u002F quantite : string\n  }\n  return quantite.toFixed(1)      \u002F\u002F quantite : number\n}\n",[36,216,217,237,259,273,278,298],{"__ignoreMap":55},[59,218,219,221,223,225,227,229,231,233,235],{"class":61,"line":62},[59,220,150],{"class":65},[59,222,154],{"class":153},[59,224,157],{"class":69},[59,226,161],{"class":160},[59,228,73],{"class":65},[59,230,77],{"class":76},[59,232,80],{"class":65},[59,234,170],{"class":76},[59,236,173],{"class":69},[59,238,239,242,245,248,251,254,257],{"class":61,"line":86},[59,240,241],{"class":65},"  if",[59,243,244],{"class":69}," (",[59,246,247],{"class":65},"typeof",[59,249,250],{"class":69}," quantite ",[59,252,253],{"class":65},"===",[59,255,256],{"class":112}," \"string\"",[59,258,173],{"class":69},[59,260,261,264,266,268,270],{"class":61,"line":93},[59,262,263],{"class":65},"    return",[59,265,181],{"class":69},[59,267,184],{"class":153},[59,269,187],{"class":69},[59,271,272],{"class":126},"\u002F\u002F quantite : string\n",[59,274,275],{"class":61,"line":105},[59,276,277],{"class":69},"  }\n",[59,279,280,282,284,287,289,292,295],{"class":61,"line":116},[59,281,178],{"class":65},[59,283,181],{"class":69},[59,285,286],{"class":153},"toFixed",[59,288,157],{"class":69},[59,290,291],{"class":76},"1",[59,293,294],{"class":69},")      ",[59,296,297],{"class":126},"\u002F\u002F quantite : number\n",[59,299,301],{"class":61,"line":300},6,[59,302,195],{"class":69},[32,304,305,306,309,310,312,313,316,317,320],{},"Dans le ",[36,307,308],{},"if",", ",[36,311,161],{}," est un ",[36,314,315],{},"string",". Après lui, il ne reste que ",[36,318,319],{},"number",". Rien à annoter : TypeScript suit le chemin du code.",[10,322,324],{"id":323},"gérer-null-et-undefined","Gérer null et undefined",[32,326,327],{},"Une valeur parfois absente s'écrit aussi avec une union.",[50,329,331],{"className":52,"code":330,"language":54,"meta":55,"style":55},"function nomAuteur(auteur: string | null) {\n  if (auteur) {\n    return auteur.toUpperCase()\n  }\n  return \"Anonyme\"\n}\n",[36,332,333,356,363,375,379,386],{"__ignoreMap":55},[59,334,335,337,340,342,345,347,349,351,354],{"class":61,"line":62},[59,336,150],{"class":65},[59,338,339],{"class":153}," nomAuteur",[59,341,157],{"class":69},[59,343,344],{"class":160},"auteur",[59,346,73],{"class":65},[59,348,170],{"class":76},[59,350,80],{"class":65},[59,352,353],{"class":76}," null",[59,355,173],{"class":69},[59,357,358,360],{"class":61,"line":86},[59,359,241],{"class":65},[59,361,362],{"class":69}," (auteur) {\n",[59,364,365,367,370,372],{"class":61,"line":93},[59,366,263],{"class":65},[59,368,369],{"class":69}," auteur.",[59,371,184],{"class":153},[59,373,374],{"class":69},"()\n",[59,376,377],{"class":61,"line":105},[59,378,277],{"class":69},[59,380,381,383],{"class":61,"line":116},[59,382,178],{"class":65},[59,384,385],{"class":112}," \"Anonyme\"\n",[59,387,388],{"class":61,"line":300},[59,389,195],{"class":69},[32,391,392,393,396,397,400,401,404],{},"Tester ",[36,394,395],{},"if (auteur)"," écarte ",[36,398,399],{},"null",". Attention : cette vérification écarte aussi le texte vide ",[36,402,403],{},"\"\"",", ce qui est parfois voulu et parfois non.",[32,406,407,408,410,411,414,415,418,419,422,423,426],{},"Pour ne retirer que ",[36,409,399],{}," et ",[36,412,413],{},"undefined",", compare avec ",[36,416,417],{},"!= null",". L'opérateur ",[36,420,421],{},"!"," en fin de valeur (",[36,424,425],{},"auteur!",") force TypeScript à te croire, sans vérification : à éviter sauf certitude.",[10,428,430],{"id":429},"les-types-littéraux","Les types littéraux",[32,432,433,434,437],{},"Un ",[45,435,436],{},"type littéral"," n'accepte qu'une valeur exacte. Combiné avec une union, il liste les valeurs permises.",[50,439,441],{"className":52,"code":440,"language":54,"meta":55,"style":55},"type Difficulte = \"facile\" | \"moyen\" | \"difficile\"\n\nfunction badge(niveau: Difficulte) {}\n\nbadge(\"facile\")\nbadge(\"simple\") \u002F\u002F Erreur\n",[36,442,443,467,471,490,494,507],{"__ignoreMap":55},[59,444,445,448,451,454,457,459,462,464],{"class":61,"line":62},[59,446,447],{"class":65},"type",[59,449,450],{"class":160}," Difficulte",[59,452,453],{"class":65}," =",[59,455,456],{"class":112}," \"facile\"",[59,458,80],{"class":65},[59,460,461],{"class":112}," \"moyen\"",[59,463,80],{"class":65},[59,465,466],{"class":112}," \"difficile\"\n",[59,468,469],{"class":61,"line":86},[59,470,90],{"emptyLinePlaceholder":89},[59,472,473,475,478,480,483,485,487],{"class":61,"line":93},[59,474,150],{"class":65},[59,476,477],{"class":153}," badge",[59,479,157],{"class":69},[59,481,482],{"class":160},"niveau",[59,484,73],{"class":65},[59,486,450],{"class":160},[59,488,489],{"class":69},") {}\n",[59,491,492],{"class":61,"line":105},[59,493,90],{"emptyLinePlaceholder":89},[59,495,496,499,501,504],{"class":61,"line":116},[59,497,498],{"class":153},"badge",[59,500,157],{"class":69},[59,502,503],{"class":112},"\"facile\"",[59,505,506],{"class":69},")\n",[59,508,509,511,513,516,519],{"class":61,"line":300},[59,510,498],{"class":153},[59,512,157],{"class":69},[59,514,515],{"class":112},"\"simple\"",[59,517,518],{"class":69},") ",[59,520,190],{"class":126},[32,522,523],{},"C'est une alternative légère à une liste de constantes. L'éditeur propose même les trois valeurs à la saisie.",[10,525,527],{"id":526},"les-autres-façons-de-rétrécir","Les autres façons de rétrécir",[32,529,530],{},"D'autres tests permettent le narrowing.",[532,533,534,547],"table",{},[535,536,537],"thead",{},[538,539,540,544],"tr",{},[541,542,543],"th",{},"Test",[541,545,546],{},"Sert à",[548,549,550,561,571,581],"tbody",{},[538,551,552,558],{},[553,554,555],"td",{},[36,556,557],{},"typeof x === \"string\"",[553,559,560],{},"Distinguer les types de base",[538,562,563,568],{},[553,564,565],{},[36,566,567],{},"x instanceof Date",[553,569,570],{},"Reconnaître un objet créé par une classe",[538,572,573,578],{},[553,574,575],{},[36,576,577],{},"\"duree\" in x",[553,579,580],{},"Savoir si un objet possède une propriété",[538,582,583,588],{},[553,584,585],{},[36,586,587],{},"x === \"facile\"",[553,589,590],{},"Comparer à une valeur précise",[32,592,593,594,597],{},"L'opérateur ",[36,595,596],{},"in"," aide à distinguer deux formes d'objets.",[50,599,601],{"className":52,"code":600,"language":54,"meta":55,"style":55},"type Plat = { cuisson: number }\ntype Boisson = { glacons: boolean }\n\nfunction detail(produit: Plat | Boisson) {\n  if (\"cuisson\" in produit) {\n    return produit.cuisson\n  }\n  return produit.glacons\n}\n",[36,602,603,625,646,650,672,687,694,699,707],{"__ignoreMap":55},[59,604,605,607,610,612,615,618,620,622],{"class":61,"line":62},[59,606,447],{"class":65},[59,608,609],{"class":160}," Plat",[59,611,453],{"class":65},[59,613,614],{"class":69}," { ",[59,616,617],{"class":160},"cuisson",[59,619,73],{"class":65},[59,621,77],{"class":76},[59,623,624],{"class":69}," }\n",[59,626,627,629,632,634,636,639,641,644],{"class":61,"line":86},[59,628,447],{"class":65},[59,630,631],{"class":160}," Boisson",[59,633,453],{"class":65},[59,635,614],{"class":69},[59,637,638],{"class":160},"glacons",[59,640,73],{"class":65},[59,642,643],{"class":76}," boolean",[59,645,624],{"class":69},[59,647,648],{"class":61,"line":93},[59,649,90],{"emptyLinePlaceholder":89},[59,651,652,654,657,659,662,664,666,668,670],{"class":61,"line":105},[59,653,150],{"class":65},[59,655,656],{"class":153}," detail",[59,658,157],{"class":69},[59,660,661],{"class":160},"produit",[59,663,73],{"class":65},[59,665,609],{"class":160},[59,667,80],{"class":65},[59,669,631],{"class":160},[59,671,173],{"class":69},[59,673,674,676,678,681,684],{"class":61,"line":116},[59,675,241],{"class":65},[59,677,244],{"class":69},[59,679,680],{"class":112},"\"cuisson\"",[59,682,683],{"class":65}," in",[59,685,686],{"class":69}," produit) {\n",[59,688,689,691],{"class":61,"line":300},[59,690,263],{"class":65},[59,692,693],{"class":69}," produit.cuisson\n",[59,695,697],{"class":61,"line":696},7,[59,698,277],{"class":69},[59,700,702,704],{"class":61,"line":701},8,[59,703,178],{"class":65},[59,705,706],{"class":69}," produit.glacons\n",[59,708,710],{"class":61,"line":709},9,[59,711,195],{"class":69},[10,713,715],{"id":714},"les-unions-discriminées","Les unions discriminées",[32,717,718,719,722],{},"Quand plusieurs formes d'objets coexistent, ajoute une propriété commune de type littéral. C'est un ",[45,720,721],{},"discriminant",", qui indique de quelle forme il s'agit.",[50,724,726],{"className":52,"code":725,"language":54,"meta":55,"style":55},"type Etape =\n  | { type: \"preparation\"; minutes: number }\n  | { type: \"cuisson\"; minutes: number; four: number }\n\nfunction resume(etape: Etape) {\n  switch (etape.type) {\n    case \"preparation\": return `${etape.minutes} min`\n    case \"cuisson\": return `${etape.four} degrés`\n  }\n}\n",[36,727,728,738,764,796,800,818,826,852,873,877],{"__ignoreMap":55},[59,729,730,732,735],{"class":61,"line":62},[59,731,447],{"class":65},[59,733,734],{"class":160}," Etape",[59,736,737],{"class":65}," =\n",[59,739,740,743,745,747,749,752,755,758,760,762],{"class":61,"line":86},[59,741,742],{"class":65},"  |",[59,744,614],{"class":69},[59,746,447],{"class":160},[59,748,73],{"class":65},[59,750,751],{"class":112}," \"preparation\"",[59,753,754],{"class":69},"; ",[59,756,757],{"class":160},"minutes",[59,759,73],{"class":65},[59,761,77],{"class":76},[59,763,624],{"class":69},[59,765,766,768,770,772,774,777,779,781,783,785,787,790,792,794],{"class":61,"line":93},[59,767,742],{"class":65},[59,769,614],{"class":69},[59,771,447],{"class":160},[59,773,73],{"class":65},[59,775,776],{"class":112}," \"cuisson\"",[59,778,754],{"class":69},[59,780,757],{"class":160},[59,782,73],{"class":65},[59,784,77],{"class":76},[59,786,754],{"class":69},[59,788,789],{"class":160},"four",[59,791,73],{"class":65},[59,793,77],{"class":76},[59,795,624],{"class":69},[59,797,798],{"class":61,"line":105},[59,799,90],{"emptyLinePlaceholder":89},[59,801,802,804,807,809,812,814,816],{"class":61,"line":116},[59,803,150],{"class":65},[59,805,806],{"class":153}," resume",[59,808,157],{"class":69},[59,810,811],{"class":160},"etape",[59,813,73],{"class":65},[59,815,734],{"class":160},[59,817,173],{"class":69},[59,819,820,823],{"class":61,"line":300},[59,821,822],{"class":65},"  switch",[59,824,825],{"class":69}," (etape.type) {\n",[59,827,828,831,833,836,839,842,844,847,849],{"class":61,"line":696},[59,829,830],{"class":65},"    case",[59,832,751],{"class":112},[59,834,835],{"class":69},": ",[59,837,838],{"class":65},"return",[59,840,841],{"class":112}," `${",[59,843,811],{"class":69},[59,845,846],{"class":112},".",[59,848,757],{"class":69},[59,850,851],{"class":112},"} min`\n",[59,853,854,856,858,860,862,864,866,868,870],{"class":61,"line":701},[59,855,830],{"class":65},[59,857,776],{"class":112},[59,859,835],{"class":69},[59,861,838],{"class":65},[59,863,841],{"class":112},[59,865,811],{"class":69},[59,867,846],{"class":112},[59,869,789],{"class":69},[59,871,872],{"class":112},"} degrés`\n",[59,874,875],{"class":61,"line":709},[59,876,277],{"class":69},[59,878,880],{"class":61,"line":879},10,[59,881,195],{"class":69},[32,883,884,885,888,889,846],{},"Dans chaque ",[36,886,887],{},"case",", TypeScript connaît la forme exacte : seule la cuisson a la propriété ",[36,890,789],{},[892,893,894],"tip",{},[32,895,896,897,899,900,903],{},"Si tu ajoutes un type d'étape et oublies un ",[36,898,887],{},", tu peux le faire détecter. Ajoute ",[36,901,902],{},"default: const verif: never = etape"," : l'erreur te rappelle la forme oubliée.",[10,905,907],{"id":906},"unknown-contre-any","unknown contre any",[32,909,910,911,410,914,846],{},"Une donnée venue d'Internet est de type incertain. TypeScript propose ",[36,912,913],{},"any",[36,915,916],{},"unknown",[50,918,920],{"className":52,"code":919,"language":54,"meta":55,"style":55},"let a: any = JSON.parse('{\"nom\":\"Crêpes\"}')\na.nimporte.quoi \u002F\u002F Accepté, plante peut-être\n\nlet u: unknown = JSON.parse('{\"nom\":\"Crêpes\"}')\nu.nom \u002F\u002F Erreur : il faut d'abord vérifier\n",[36,921,922,951,959,963,989],{"__ignoreMap":55},[59,923,924,926,929,931,934,936,939,941,944,946,949],{"class":61,"line":62},[59,925,66],{"class":65},[59,927,928],{"class":69}," a",[59,930,73],{"class":65},[59,932,933],{"class":76}," any",[59,935,453],{"class":65},[59,937,938],{"class":76}," JSON",[59,940,846],{"class":69},[59,942,943],{"class":153},"parse",[59,945,157],{"class":69},[59,947,948],{"class":112},"'{\"nom\":\"Crêpes\"}'",[59,950,506],{"class":69},[59,952,953,956],{"class":61,"line":86},[59,954,955],{"class":69},"a.nimporte.quoi ",[59,957,958],{"class":126},"\u002F\u002F Accepté, plante peut-être\n",[59,960,961],{"class":61,"line":93},[59,962,90],{"emptyLinePlaceholder":89},[59,964,965,967,970,972,975,977,979,981,983,985,987],{"class":61,"line":105},[59,966,66],{"class":65},[59,968,969],{"class":69}," u",[59,971,73],{"class":65},[59,973,974],{"class":76}," unknown",[59,976,453],{"class":65},[59,978,938],{"class":76},[59,980,846],{"class":69},[59,982,943],{"class":153},[59,984,157],{"class":69},[59,986,948],{"class":112},[59,988,506],{"class":69},[59,990,991,994],{"class":61,"line":116},[59,992,993],{"class":69},"u.nom ",[59,995,996],{"class":126},"\u002F\u002F Erreur : il faut d'abord vérifier\n",[32,998,999,1001,1002,1004],{},[36,1000,913],{}," coupe la vérification. ",[36,1003,916],{}," accepte n'importe quelle valeur mais interdit de s'en servir avant de l'avoir vérifiée avec un narrowing.",[50,1006,1008],{"className":52,"code":1007,"language":54,"meta":55,"style":55},"if (typeof u === \"string\") {\n  console.log(u.toUpperCase())\n}\n",[36,1009,1010,1027,1043],{"__ignoreMap":55},[59,1011,1012,1014,1016,1018,1021,1023,1025],{"class":61,"line":62},[59,1013,308],{"class":65},[59,1015,244],{"class":69},[59,1017,247],{"class":65},[59,1019,1020],{"class":69}," u ",[59,1022,253],{"class":65},[59,1024,256],{"class":112},[59,1026,173],{"class":69},[59,1028,1029,1032,1035,1038,1040],{"class":61,"line":86},[59,1030,1031],{"class":69},"  console.",[59,1033,1034],{"class":153},"log",[59,1036,1037],{"class":69},"(u.",[59,1039,184],{"class":153},[59,1041,1042],{"class":69},"())\n",[59,1044,1045],{"class":61,"line":93},[59,1046,195],{"class":69},[1048,1049,1050],"warning",{},[32,1051,1052,1053,1055],{},"Les types disparaissent à la compilation. Une réponse d'API annotée d'un type n'est pas vérifiée pour autant. Pour une donnée extérieure, préfère ",[36,1054,916],{}," et vérifie-la toi-même.",[10,1057,1059],{"id":1058},"à-retenir","À retenir",[15,1061,1062,1069,1075,1088,1091],{},[18,1063,1064,1065,1068],{},"Une union ",[36,1066,1067],{},"A | B"," accepte l'un ou l'autre des types.",[18,1070,1071,1072,1074],{},"Un type littéral comme ",[36,1073,503],{}," n'accepte qu'une valeur précise.",[18,1076,1077,1078,309,1080,309,1082,309,1085,1087],{},"Le narrowing (",[36,1079,247],{},[36,1081,596],{},[36,1083,1084],{},"instanceof",[36,1086,253],{},") précise le type dans un bloc.",[18,1089,1090],{},"Une union discriminée utilise une propriété littérale commune pour reconnaître chaque forme.",[18,1092,1093,1095,1096,1098],{},[36,1094,916],{}," oblige à vérifier la valeur avant usage ; ",[36,1097,913],{}," supprime toute vérification.",[1100,1101,1102],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}",{"title":55,"searchDepth":86,"depth":93,"links":1104},[1105,1106,1107,1108,1109,1110,1111,1112,1113,1114],{"id":12,"depth":86,"text":13},{"id":29,"depth":86,"text":30},{"id":136,"depth":86,"text":137},{"id":203,"depth":86,"text":204},{"id":323,"depth":86,"text":324},{"id":429,"depth":86,"text":430},{"id":526,"depth":86,"text":527},{"id":714,"depth":86,"text":715},{"id":906,"depth":86,"text":907},{"id":1058,"depth":86,"text":1059},"Combine plusieurs types avec une union, restreins-les à des valeurs précises, puis affine le type avec typeof, in et les unions discriminées.","md",{},[47,436,210,247,596,1119,1120,1121,413],"union discriminée","never",null,"intermediaire","\u002Fts\u002Funions-et-narrowing",[1125],"\u002Fts\u002Fobjets-interfaces-types",[1127,1131],{"nom":1128,"url":1129,"type":1130},"Grafikart, formation TypeScript","https:\u002F\u002Fgrafikart.fr\u002Fformations\u002Ftypescript","cours",{"nom":1132,"url":1133,"type":1134,"anglais":89},"Le narrowing (en anglais)","https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002F2\u002Fnarrowing.html","doc",{"title":5,"description":1115},[1137,1139],{"nom":1138,"url":1133},"Le narrowing, documentation de TypeScript (en anglais)",{"nom":1140,"url":1141},"Les types courants, documentation de TypeScript (en anglais)","https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002F2\u002Feveryday-types.html","ts\u002F04.unions-et-narrowing","WMbJqcqVTcwVPHm4LinWN4qROnXkmdGhto1CAREnNzo",[1145,1149,1153,1156,1157,1161,1165],{"path":1146,"title":1147,"stem":1148},"\u002Fts\u002Fpourquoi-typescript","Pourquoi TypeScript","ts\u002F01.pourquoi-typescript",{"path":1150,"title":1151,"stem":1152},"\u002Fts\u002Ftypes-de-base","Types de base et fonctions","ts\u002F02.types-de-base",{"path":1125,"title":1154,"stem":1155},"Objets, interface et type","ts\u002F03.objets-interfaces-types",{"path":1123,"title":5,"stem":1142},{"path":1158,"title":1159,"stem":1160},"\u002Fts\u002Fgeneriques-et-utilitaires","Génériques et types utilitaires","ts\u002F05.generiques-et-utilitaires",{"path":1162,"title":1163,"stem":1164},"\u002Fts\u002Ftypescript-dans-vue-et-nuxt","TypeScript dans Vue et Nuxt","ts\u002F06.typescript-dans-vue-et-nuxt",{"path":1166,"title":1167,"stem":1168},"\u002Fts","TypeScript","ts\u002Findex",[1170,1172],{"title":1154,"path":1125,"stem":1155,"description":1171,"children":-1},"Décris la forme d'un objet avec un type objet, une interface ou un alias de type, puis choisis entre les deux.",{"title":1159,"path":1158,"stem":1160,"description":1173,"children":-1},"Écris des fonctions et des types réutilisables avec les génériques, puis dérive des types avec Partial, Pick, Omit et Record.",[1175],{"path":1125,"title":1154,"ligne":54},[1177,1179,1180,1181,1182,1183,1185],{"path":1146,"title":1147,"niveau":1178,"stem":1148},"debutant",{"path":1150,"title":1151,"niveau":1178,"stem":1152},{"path":1125,"title":1154,"niveau":1178,"stem":1155},{"path":1123,"title":5,"niveau":1122,"stem":1142},{"path":1158,"title":1159,"niveau":1122,"stem":1160},{"path":1162,"title":1163,"niveau":1184,"stem":1164},"avance",{"path":1166,"title":1167,"niveau":1186,"stem":1168},"memo",1794583435392]