JavaScript naar TypeScript: van PropTypes naar interfaces
Hier breng je JavaScript naar TypeScript zonder de eerste, saaie ronde van een migratie met de hand te doen. De converter leest je code met een parser, maakt van React PropTypes interfaces, haalt types uit standaardwaarden en voegt de types toe die zich laten afleiden. Als js naar ts converter werkt hij op één bestand of fragment tegelijk, voert hij je code nooit uit en uploadt hij niets.Wat hij niet kan weten, laat hij aan jou over. De onderdelen hieronder zeggen precies wat dat is.
JavaScript naar TypeScript online, stap voor stap
- Plak je code in het veld JavaScript of JSX. Tot je iets plakt, staat er "Plak hier JavaScript of JSX…". De limiet is 5.000.000 tekens.
- Wacht even. De tool zet de code om terwijl je typt of plakt, ongeveer 0,35 seconde na de laatste wijziging, dus er is geen knop om op te drukken.
- Lees het resultaat onder de kop "TypeScript", of "TypeScript (TSX)" als de code JSX bevat. Het verschijnt als gemarkeerde code die je alleen kunt lezen.
- Bekijk de meldingen boven de code. Ze vertellen wat er is gedaan, bijvoorbeeld "2 interfaces geschreven" of "11 typeannotaties toegevoegd". Had niets een type nodig, dan staat er "Hier had niets een type nodig, dus de code is alleen opnieuw opgemaakt."
- Kies Kopiëren naar klembord. De knop verandert in "Gekopieerd".
- Onder de code staan de Conversie-opties met twee selectievakjes, React-modus en Strikte modus. Verander je er een, dan wordt de code opnieuw verwerkt.
Is de tekst geen geldig JavaScript, dan zie je "Dit is geen geldig JavaScript: syntaxfout op regel N, kolom M." met de regel in kwestie en een markering eronder. Code die al TypeScript-syntax bevat, telt als ongeldig. De tool werkt op de code die je plakt, dus hij past bij een component, een module of een fragment, niet bij een hele repository.
Een voorbeeld: een React-component met PropTypes
De invoer is een kleine teller met PropTypes en een event handler zonder type. De converter schrijft het interface CounterProps: label is verplicht door isRequired, terwijl start en onChange optioneel zijn. De standaardwaarde n = 1 wordt n: number = 1, en de onClick-handler op een button geeft e het type React.MouseEvent voor het knopelement. De ongebruikte import van prop-types verdwijnt en Prettier verdeelt de JSX over meerdere regels. In totaal meldt de tool 1 interface en 3 typeannotaties.
Wat niet verandert: useState(start) blijft staan zoals het was, omdat de converter geen type raadt uit hoe een waarde wordt gebruikt.
React PropTypes naar TypeScript: hoe ze een interface worden
Met de React-modus aan schrijft de converter uit de PropTypes van een component een interface met de naam NaamProps, zet die boven de component en typeert de props ermee. Dat werkt voor functiecomponenten (declaraties, pijlfuncties en componenten in memo) en voor klassen met een statische propTypes of een toewijzing Foo.propTypes = {...}. Een prop met .isRequired is verplicht, elke andere krijgt een ?. Commentaar boven een prop gaat mee naar het interface.
stringennumberblijvenstringennumberboolwordtbooleanfuncwordt een functietype met willekeurige argumentenarrayenobjectwordenany[]en een Record met sleutelstringnodeenelementwordenReactNodeenReactElementarrayOf(T)enobjectOf(T)wordenT[]en een Record met waardeToneOf([...])wordt een union van literals, zoals'sm' | 'lg'oneOfType([...])wordt een union van de genoemde typesshape({...})enexact({...})worden een objecttypeinstanceOf(Foo)wordtFoo
De propTypes-regel wordt verwijderd, en de import van prop-types ook als niets anders hem gebruikt. Een klassecomponent krijgt daarnaast een state-interface uit this.state = {...}. Een klasse zonder PropTypes krijgt een props-interface op basis van de this.props.x die ze leest. Een functiecomponent zonder PropTypes krijgt alleen in de strikte modus een props-interface.
Welke types erbij komen zonder PropTypes, en JSX naar TSX
- Standaardwaarden: een parameter met een standaardwaarde krijgt daar zijn type van, dus
n = 5wordtn: number = 5enlet x = 0wordtlet x: number = 0. - Retourtypes: toegevoegd als elke
returnhetzelfde primitieve type geeft (string,numberofboolean) of als er geen is:void, of een Promise vanvoidbij eenasync-functie. - Klasse-eigenschappen: elke
this.x = ...in een klasse (die niets uitbreidt, of een React-component) krijgt een eigenschapsdeclaratie. - React-events: handlerparameters op DOM-elementen krijgen het passende eventtype, zoals
React.ChangeEvent, bijonChange,onClickofonSubmit. - Refs:
useRef(null)neemt het elementtype over van deref={...}waaraan hij hangt.
Voor JSX naar TSX plak je gewoon de component: bevat de code JSX, dan heet het resultaat "TypeScript (TSX)". De strikte modus staat standaard uit. Zet hem aan om alle gaten te zien. Hij schrijft een expliciete any waar geen type is af te leiden: let x; wordt let x: any;, const list = [] wordt any[], en parameters zonder type krijgen : any. Staat hij uit, dan blijven die plekken zonder type. Aan maakt het lijstje van wat je nog moet oplossen makkelijk doorzoekbaar.
Wat de converter met rust laat, commentaar en privacy
Hij leest één stuk code en raadt niets. Deze gevallen blijven staan of worden any:
- Callbackparameters die rechtstreeks aan een aanroep worden meegegeven, zoals bij
items.map((x) => ...): die blijven staan, zodat TypeScript ze typeert vanuit de functie die ze ontvangt. - Types uit een ander bestand of een eigen PropTypes-validator: die worden
any, en de validator zelf blijft niet bewaard. - Een
forwardRef-component: de PropTypes blijven onaangeroerd. - JSDoc-typecommentaar wordt niet gelezen.
- Een type raden uit de naam van een parameter of uit hoe hij wordt gebruikt gebeurt nooit.
- Geen inferentie tussen bestanden: verwerk en controleer één bestand tegelijk.
- Met de React-modus uit blijven PropTypes ongemoeid.
De uitvoer is een eerste ronde, geen afgeronde migratie. Plak hem in je project, draai tsc en maak elke any met de hand strakker. De converter hernoemt geen bestanden, dus sla de component zelf op als .tsx.
Commentaar en opmaak blijven bewaard: de code wordt gelezen met @babel/parser, elke annotatie wordt als bewerking in je oorspronkelijke tekst gezet, en Prettier maakt het resultaat daarna netjes met jouw aanhalingstekens, puntkomma's en inspringing. Alles draait in een Web Worker in je browser, en je code wordt nooit geüpload of uitgevoerd. Wil je code eerst opschonen, gebruik dan Code Formatter. Wil je een geminimaliseerd of versluierd script eerst begrijpen, gebruik dan JS-deobfuscator.
Veelgestelde vragen
Hoe brengt een js naar ts converter mijn code naar TypeScript?
Plak je JavaScript of JSX in het veld "JavaScript of JSX". Ongeveer een derde seconde later verschijnt het TypeScript onder de kop "TypeScript", of "TypeScript (TSX)" als de code JSX bevat. Er is geen knop om te starten. Met "Kopiëren naar klembord" neem je het resultaat mee.
Kan ik React PropTypes naar TypeScript krijgen als interface?
Ja. Met de React-modus aan wordt elk propTypes-object een interface met de naam van de component, zoals CounterProps. Een prop met isRequired is verplicht en elke andere krijgt een vraagteken. De propTypes-regel wordt verwijderd, en de import van prop-types ook als niets anders in het bestand hem nog gebruikt. Het werkt voor functiecomponenten en voor klassen met een statische propTypes.
Hoe krijg ik een React component naar TypeScript als TSX?
Plak de JSX-component. Bevat de code JSX, dan heet het resultaat "TypeScript (TSX)" en gaat de React-modus vanzelf aan, zodat props een interface krijgen en handlers eventtypes. De tool hernoemt geen bestanden. Sla het resultaat in je project op met de extensie .tsx, zo kom je van jsx naar tsx.
Wat doen de React-modus en de Strikte modus?
De React-modus, onder "Conversie-opties", maakt van PropTypes interfaces en typeert event handlers, props en hooks. Hij staat standaard aan als de code JSX, react of prop-types bevat, en met hem uit blijven PropTypes ongemoeid. De Strikte modus staat standaard uit en schrijft een expliciete any waar geen type is af te leiden, in plaats van het weg te laten.
Waarom staat er nog any in de uitvoer?
Een type wordt alleen geschreven als het uit de code zelf te lezen is. Een eigen PropTypes-validator of een type dat uit een ander bestand komt, wordt any, en de Strikte modus voegt een expliciete any toe aan variabelen en parameters zonder type. De uitvoer is een eerste ronde. Laat hem door tsc lopen en vervang de any-types door de echte.
Waarom is de parameter van een callback niet getypeerd?
Een parameter die rechtstreeks aan een aanroep wordt meegegeven, zoals x in items.map((x) => x.id), blijft met opzet staan zoals hij is, zodat TypeScript hem nog kan typeren vanuit de functie die de callback ontvangt.
Blijven mijn commentaar en opmaak bewaard?
Commentaar blijft staan, omdat annotaties als tekstbewerking in je oorspronkelijke code worden gezet in plaats van dat de code opnieuw wordt opgebouwd. Daarna loopt Prettier erover, dat je aanhalingstekens, puntkomma's en inspringing behoudt maar lange regels opnieuw kan afbreken. Commentaar boven een PropTypes-regel gaat mee naar de bijbehorende eigenschap van het interface.
Wordt mijn code geüpload of uitgevoerd?
Nee. De code wordt in je browser gelezen en herschreven, in een Web Worker, en nooit naar een server gestuurd. Hij wordt ook nooit uitgevoerd. Bij een syntaxfout zie je de melding met regel en kolom. De limiet is 5.000.000 tekens.
Aanbevolen
-
Anker 7-in-1 USB-C hubEén hub voor de HDMI-, SD- en USB-poorten die je laptop mist, zodat je migratiesetup maar één keer aangesloten hoeft.
-
InnoView 15,6" Draagbare MonitorHoud het oude .js-bestand op dit scherm en het geconverteerde .ts ernaast terwijl je elk type controleert.
-
Logitech Lift Vertical ergomuisEen verticale greep die je pols spaart tijdens de lange weken van een codebase-migratie.
Help de tools gratis te houden. ✨
Afbeeldingen dienen ter illustratie. Als Amazon-Partner verdien ik aan in aanmerking komende aankopen.