Takže v Jave budem čítať vstup, čo len z konzoly, a pri pokuse priradiť načítaný string do premennej typu int mi program nespadne na runtime error?
to typescript nedovolí. Musíte nejdřív převést na číslo.
Ale dovolí. Lebo za runtime tam z TS syntaxu neostane ani zmienka. Vo formulári ti užívateľ zadá text miesto čísla a TS ti s tým nijak nepomôže. Len si pletieš buildtime s runtime.
TS rozumí konverzím a assercím. Ví, že výsledek parseInt, Number, parseFloat je číslo. Rozumí testování na NaN. V runtime zmizí pouze anotace specifické pro TS, javascriptové asserce zůstanou. Flow funguje stejně.
Hurá, blížime sa k tomu, na čo som pôvodne pýtal. Takže to spresním: majme funkciu v čistom JS:
function naDruhu (num) {
return num * num
}
Táto funkcia si vôbec nestráži typ a pokiaľ ju niekto zavolá so zle zadaným parametrom z formulára, napríklad v tvare naDruhu('Jožo'), funkcia dá nečakaný výsledok. Použijem teda akože TS a nadefinujem typ:
function naDruhu (num: number) {
return num * num
}
Nedal som do kódu žiadnu kontrolu, pretypovanie, či parsovanie parametru. Lebo veď som nadefinoval typ parametru a spolieham naň. Že to nie je presný syntax TS nie je dôležité. Dôležité je, na čo sa pýtam, že čo sa udeje pri transpilácii. Lebo pokiaľ sa po transpilácii vyššie uvedená funkcia s typmi jednoducho transpiluje do čistého JS tak, že sa len odstránia definície typov, čiže naspäť do pôvodného tvaru,
function naDruhu (num) {
return num * num
}
tak mi je TS a celé typy na kokot, akurát tak mám hinty počas písania a kontrolu počas transpilácie, ktorá však nič zlé nezistí, lebo nevie dopredu, či mi užívateľ zadá vo formulári platné číslo. Keby však robila to, čo chcem vedieť či naozaj robí, či definícia typu zároveň zabezpečí, že pri transpilácii sa môj kód rozšíri o kontrolu typu, aby fungoval aj počas behu aplikácie, takže napríklad takto:
// moja definícia
function (num: number) {
return num * num
}
// po transpilácii napríklad takto,
// ako tu písal iný, s parseInt
function (num) {
if (!parseInt(num)) throw new Error()
return num * num
}
Zasa. Nemudrovať nad konkrétnym kódom. Otázka znie: zabezpečí mi definícia typu, že bude kontrolovaná otypovaná premenná aj za behu? Tak, že mi do kódu dopíše nejakú kontrolu? Alebo si takéto parsovanie / pretypovanie / kontrolu na správny typ dodanej za behu, vopred neznámej za návrhu, musím aj tak robiť sám, dopísať do kódu ručne? Sám?