Vad är TypeScript-ekvivalenten till en Rust-struct?
Jag har skrivit i TypeScript i ungefär ett år nu, och jag har stött på ett trevligt projekt på Github skrivet i Rust som jag skulle vilja omsluta med TypeScript. Jag har aldrig programmerat i Rust men jag har erfarenhet av C++. Jag tror att min fråga i titeln är tillräckligt tydlig. Är en struct i Rust på något sätt lik en interface i TypeScript?
Svar #1
Är en struct i Rust ungefär som ett interface i TypeScript?
Typ, men nej.
Ett TypeScript-gränssnitt deklarerar vilka medlemmar ett objekt måste ha för att uppfylla gränssnittet, men objektet kan ha fler medlemmar. Det är möjligt för ett JavaScript-objekt att uppfylla flera TypeScript-gränssnitt med mycket olika former, helt enkelt genom att samtidigt ha allt som behövs för dessa gränssnitt.
I Rust är en struct definitionen av en sammansatt typ. Varje värde av den typen har exakt de medlemmar som deklareras i structens definition -- inte fler, inte färre.
Det skulle vara en bättre analogi att säga att ett TypeScript-interface är som ett Rust-trait. Båda deklarerar en uppsättning av "saker" som krävs för att uppfylla interfacet/traiten, och flera traits kan implementeras på samma struct. Detta är dock fortfarande inte en 100% korrekt analogi eftersom traits inte kan deklarera fält (datamedlemmar/egenskaper), bara funktioner, konstanter och typer.
Observera också att TypeScript-gränssnitt är strukturella, inte nominella. Detta innebär att två TypeScript-gränssnitt med exakt samma struktur i praktiken är utbytbara trots att de har olika namn; du kan implicit "konvertera" en variabel från ett sådant gränssnitt till ett annat, och ingen typomvandling krävs för att göra det. I Rust är två strukturer med identiskt deklarerade fält inte utbytbara på detta sätt, och detta gäller inte heller för traits med identiskt innehåll. (Om det gjorde det, skulle markörtraits som Copy, Send, Sync, etc. inte kunna existera eftersom de skulle vara implicit implementerade på varje typ!)
Vad är TypeScript-ekvivalenten till en Rust-struct?
Det finns egentligen inget riktigt bra motsvarande. Structs definierar vilka fält ett värde har, men i JavaScript/TypeScript har objekt inte en oföränderlig form - de kan alltid utökas med nya saker när som helst (förutom när de är frysta/sealade), så JavaScript behöver inte konceptet "struct" i sig. Dynamiskt typade språk har generellt inte behov av fältdeklarationer; detta är något som man tenderar att bara se i statiskt typade språk.
TypeScript tillför en viss mängd statisk typning till JavaScripts dynamik, men dynamiken finns fortfarande kvar även i TypeScript. TypeScript är inte så mycket "statiskt typad JavaScript" som det är "JavaScript med lite typkontroll insprängd."
Svar #2
Typescript "type alias" är motsvarande Rust "Struct". Det finns stora skillnader i att använda Interfaces och Type Alias; Interfaces används mer för API-centrerade typdefinitioner.
Typalias är den perfekta liknelsen för Struct i TS.