Asi by som mal povedat, ze tato tema ma napadla preto, ze teraz v C# riesim zasa UI (vdaka Blazoru) a pisem aj nejake kniznice. A tieto dve domeny maju trochu specificke naroky.
co sa da uz dnes riesit source generatormi
Ano, presne preto, aby sa to nemuselo riesit source generatormi. Isteze source generatori su sposob, ako vies vyriesit vela veci, ale je to imho najhorsi sposob, ked uz nic ine nezostava. (Anders Hejlsbers im branil takmer 15 rokov, cize niesom sam, kto si to mysli.)
Ja si myslim, ze v casoch pattern matchingu nepotrebuje nikto union typy
Praveze nie. Napriklad Int a String nemaju spolocnu base classu, cize toto:
function padLeft(padding: string | number): string {
if (typeof padding === "number") {
...
}
else {
...
}
}
by si musel napisal ako netypovy kod
string padLeft(object padding)
{
switch (padding)
{
case Int int: ...
break;
case string int: ...
break;
default:
throw new ArgumentException(nameof(padding));
}
}
v pripade parametrov funkcii sa to este da riesit rozne, napriklad cez overload, ale property, alebo variable uz tak nevyriesis. Spominal si na WCF, ako generovalo DTOcka s WDL. Bud vygenerovalo property typu Object, alebo dve property. Obe je nespravne.
Iny Priklad. Vevies vytvorit z classy odvodenu classu, ktora ma vsetky property nullable - velmi sikovne pri tvorbe kniznic.
napr:
interface IMyState { string: Name; count: number };
public state: IMyState {get; set;}
void SetState(state: Optional<IMyState>) { .... }
setState({ count: 1 };
A ked z toho chces spravit genericke API, ani source generatori ti nepomozu.
Rovnako napriklad je obcas uzitocne odvodit classu, ktora ma iba readonly vlastnosti:
void foo<T>(value: Readonly<T>);
Literal types…Proste v javascripte museli nejako vyriesit chybajuce enumy
omyl. Enumy mohli vyriesit pridanim enumov, co aj spravili neskor.
takyto C# kod je uplne bezny:
void Foo(Direction someEnum)
{
switch(someEnum)
{
case SomeEnum.Value1: ...
break;
case SomeEnum.Value2: ...
throw new InvalidOperationException("Value 2 is not valid in this context");
case SomeEnum.Value3: ...
break;
default:
throw new ArgumentOutOfRangeException();
}
}
v typescripte vies spravit odvodeny typ, ktory nebude obsahovat Value2.
Type SomeEnumWithoutValue1 = Extract<SomeEnum, SomeEnum.Value3>;