Всички знаят тези дни, че „Typescript е строго синтактично надмножество на JavaScript и добавя незадължително статично въвеждане към езика.“. Но какво всъщност означава? Защо миграцията от JavaScript към Typescript е толкова гладка? Какви са разликите между Typescript и други езици със статичен тип като Java или C#? Ще се опитам да разгледам тези точки в тази статия.

Първо нека попитаме: какво е статично въвеждане? Като цяло можем да категоризираме системите от типове на езиците за програмиране в две групи: 1- Статично въвеждане 2- Динамично въвеждане.

Динамичното въвеждане е мястото, където проверката на типа се извършва по време на изпълнение, докато при статичното въвеждане проверката на типа се извършва по време на компилиране. JS и Python са два езика, които използват динамично писане. При динамичното въвеждане вие ​​сте основно сами и компилаторът не ви помага, например, ако сте присвоили номер на променлива от тип string.

Друг начин, по който можем да класифицираме типовите системи, е като ги категоризираме в 1- Структурно типизиране 2- Номинативно типизиране. Това разграничение е мястото, където Typescript се различава от езици като Java или Rust и прави работата с Typescript радост за JS разработчиците.

И така, какво е това структурно типизиране? Системите със структурни типове използват структурите на типа и наличните свойства за проверка на типа. Тези системи за типове не се интересуват от името на типа или къде е деклариран. Системи с номинативни типове — както можете да се досетите от името им — проверка на типа въз основа на името на типовете. Приказките са достатъчни, нека да видим кода:

В горния код Person1и Person2са два различни типа с различни имена, но структурно са едно и също нещо, следователно person2може да се присвои на личност1. Ако преди това сте работили с езици като Java, може би знаете, че тези две променливи не могат да бъдат присвоени една на друга, защото те са „номинативно“ различни типове.

И така, защо Typescript е структурно въведен като начало?

Ако все още си спомняте първия абзац (Ако си спомняте, поздравления за вашия приятел!), споменах, че миграцията от Typescript към JavaScript е най-вече безпроблемна работа и това със сигурност не е съвпадение. Инженерите на Typescript са наблюдавали отблизо как работи JavaScript и неговата система от типове и са се опитали да имитират това преживяване в статично въведен език. JavaScript използва Duck Typing, който е доста подобен на Structural Typing, но в контекст на динамично въвеждане.

Поетът от Индиана „Джеймс Уиткомб Райли“ (1849–1916) е казал известното:

Когато видя птица, която ходи като патица, плува като патица и кряка като патица, аз наричам тази птица патица.

Това вероятно е мястото, където произлиза техниката Duck Typing. Езици като Python или JS, за да проверяват типа, разглеждат наличните методи и свойства в даден обект, ако съществуват, тогава този обект е подходящ за тип. Нека да разгледаме долния пример за въвеждане на патица в Python:

Както видяхме, изглежда, че дизайнерите на Typescript целенасочено са използвали Structural Typing, за да проектират Typescript възможно най-близо до поведението на JavaScript.