Lepší chybové zprávy v TypeScript 4.2 – chytřejší zachování aliasu typu

Nedávno byl vydán TypeScript 4.2 s mnoha skvělými novými funkcemi a vylepšeními. Je opravdu působivé vidět, jak TypeScript krok za krokem vylepšuje vývojářskou zkušenost.
V tomto krátkém příspěvku se zaměříme na jednu funkci, nazvanou Smarter Type Alias ​​Preservation. Za sebe mohu říci, že tuto funkci opravdu očekávám. Stručně řečeno, vylepšuje chybové zprávy týkající se sjednocovacích typů sjednocovacích typů. Doufám, že za pár minut lépe pochopíte, co to znamená a proč je to užitečné.

Neztraťte se při sdružování typů. (Foto Emily Blincoe)

V čem je tedy problém?

Až do TypeScriptu 4.2 kompilátor při použití sjednocovacího typu, který obsahoval alespoň jeden sjednocovací typ, typy „zploštěl“. Jednodušeji řečeno – nebylo možné určit, které typy sjednocovací typ obsahuje. Zvažte následující zjednodušený příklad, kde je typ parametru a je spojení dvou dlouhých typů a undefined :

type LongType1 =
'type1' |
'type2' |
//...
'type19';

type LongType2 =
'_type1' |
//...
'_type19';

function myFunc (a: LongType1 | LongType2 | undefined) {
  return a;
}

myFunc('bummer'); // Argument of type '"bummer"' is not assignable to parameter of type '"type1" | "type2" | "type3" | "type4" | "type5" | ... 33 more ... | undefined'.(2345)

Je velmi obtížné pochopit tuto chybu:Odkud pocházejí tyto řetězcové literály? Na jaký typ se mám podívat? Jaký je zbytek 33 more platné hodnoty? To může způsobit spoustu zmatku a frustrace.

Co je nového?

TypeScript 4.2 vám v tomto ohledu usnadní život. Chytřejší zachování aliasů typu umožňuje TypeScriptu „zapamatovat si“, které sjednocovací typy jsou při zobrazování chybových zpráv používány . Místo zploštění sjednocovacích typů bude jejich alias zachován a zobrazen. Viz stejný kód z předchozího příkladu, zkompilovaný pomocí TypeScript 4.2.

type LongType1 =
'type1' |
'type2' |
//...
'type19';

type LongType2 =
'_type1' |
//...
'_type19';

function myFunc (a: LongType1 | LongType2 | undefined) {
  return a;
}

myFunc('bummer'); //Argument of type '"bummer"' is not assignable to parameter of type 'LongType1 | LongType2 | undefined'.(2345)

Jak můžete vidět, TypeScript si "pamatuje" "type1" | "type2" | ... | "type19" je ve skutečnosti LongType1 a "_type1" | "_type2" | ... | "_type19" je LongType2 . TypeScript je skutečně chytřejší se zachováním aliasů typu! Chyba je mnohem intuitivnější, takže nyní můžete svou frustraci přesunout na něco jiného.

Jak Daniel Rosenwasser zmínil v oznámení, tato vylepšení byla umožněna dvěma žádostmi o stažení od Anderse Hejlsberga (PR1, PR2). Nebudu se zde pouštět do detailů implementace. Doporučuji vám však projít si změny v src/compiler/checker.ts nebo popisy požadavků na stažení.

Zabalit

TypeScript 4.2 přinese mnoho zajímavých nových funkcí. Jedním z nich je Smarter Type Alias ​​Preservation, díky kterému budou určité typové chyby mnohem informativnější. Doufám, že nyní lépe chápete význam této funkce. Unijní typy nebyly nikdy lepší!