TypeSpec: Neue Sprache für API-zentrierte Entwicklung
(typespec.io)- TypeSpec ist eine neue Sprache für API-zentrierte Entwicklung und wurde entwickelt, um die Anforderungen von API-Entwicklern, -Architekten und -Managern zu erfüllen.
- Es wurde in einem Umfeld entwickelt, in dem es immer schwieriger und wichtiger wird, konsistent qualitativ hochwertige APIs und passende Erlebnisse bereitzustellen.
- TypeSpec ist mehr als nur eine Sprache; es ist eine Plattform, die Abstraktion ermöglicht, die Wiederverwendung von Code fördert und moderne Tools für eine schnelle Entwicklung einsetzt.
Hauptmerkmale von TypeSpec
- Interoperabilität
- TypeSpec ist keine einfache API-Beschreibungssprache, sondern eine hochrangige Definitionssprache, mit der sich APIs definieren und gleichzeitig für verschiedene Protokolle, Clients, Server und Dokumentation ausgeben lassen.
- Es ist mit branchenweiten API-Definitionssprachen interoperabel und überbrückt dadurch die Lücken zwischen verschiedenen Optionen.
- Produktivität
- TypeSpec bietet ein hervorragendes Entwicklererlebnis, das den Daten- und API-Definitionsprozess angenehmer und produktiver macht.
- Die Sprache ist prägnant und erlaubt es, komplexe Daten- und API-Formen mit minimalem Aufwand zu definieren.
- API-Muster
- TypeSpec kapselt gängige Datentypen, API-Muster und Richtlinien in wiederverwendbare, hochrangige Bausteine, die team- oder Ökosystem-weit geteilt werden können, um die API-Qualität zu verbessern.
- Vertrautheit
- TypeSpec fühlt sich durch die Inspiration aus TypeScript und C# vielen Entwicklern vertraut an und ist leicht zu erlernen.
- Erweiterbarkeit
- TypeSpec kann über benutzerdefinierte Dekoratorvokabulare und Typvorlagen erweitert werden, sodass APIs in Geschäfts- oder Anwendungslogik-Domänen modelliert werden können.
- Ökosystem
- Mit TypeSpec lassen sich gemeinsame Typen, Sprach-Erweiterungen, Linter und Emitter als Pakete bündeln und intern in der Organisation oder im gesamten Ökosystem über npm bereitstellen.
Community und Zusammenarbeit
- Einsatz bei Microsoft
- Microsoft setzt TypeSpec ein, um den API-Entwicklungsprozess zu revolutionieren.
- Viele Azure-Dienste haben TypeSpec übernommen, und deren Anzahl wächst täglich.
- Das Microsoft-Graph-Team nutzt das Potenzial von TypeSpec, um die Produktivität zu steigern und die Anpassung zu vereinfachen.
- Aufruf zur Teilnahme
- TypeSpec ist mehr als eine Sprache – es ist eine Community.
- Alle Entwickler mit unterschiedlichen Hintergründen sind eingeladen, an der offenen Beta teilzunehmen und die Stärke von TypeSpec selbst auszuprobieren.
Meinung von GN⁺
- TypeSpec wirkt wie eine API-Definitionssprache mit hohem Abstraktionsniveau, die die Art und Weise der API-Entwicklung grundlegend verbessern könnte.
- Der "API First"-Ansatz wird unterstützt und kann die Entwicklungseffizienz sowie die Produktqualität verbessern.
- Durch die breite Protokollunterstützung, Erweiterbarkeit und ein starkes Ökosystem dürfte TypeSpec in vielen Entwicklungsszenarien einsetzbar sein.
- Da die Einführung einer neuen Sprache jedoch immer mit Kosten für das Erlernen verbunden ist, sollte vor einer Team-Einführung eine ausreichende Schulung vorausgehen.
- Es ist positiv, dass man versucht hat, die Lernkurve durch die Übernahme der Syntax von TypeScript und C# zu senken.
- Es scheint notwendig, die Unterscheidungsmerkmale gegenüber bestehenden API-Definitionssprachen mit ähnlicher Funktion (wie Swagger, RAML, API Blueprint usw.) klarer herauszuarbeiten.
- Beispielsweise, wie bestehende Grenzen überwunden werden und wie einfach Migrationen möglich sind.
- Der Umstand, dass Microsoft TypeSpec intern zuerst nutzt und es durch Dogfooding weiter verbessert, wirkt vertrauenswürdig.
- Da es erst seit kurzer Zeit als Open-Source-Projekt öffentlich verfügbar ist, werden kontinuierliche Weiterentwicklung und Community-Support in den kommenden Jahren entscheidend sein.
- Die Richtung der Standardisierung und verbesserten Wiederverwendbarkeit in der API-Gestaltung ist richtig, zugleich entsteht der Eindruck, dass versucht wird, zu viele Probleme auf einmal zu lösen.
- Es wäre sinnvoll, mit klaren Prioritäten schrittweise Funktionen zu verstärken.
1 Kommentare
Meinungen auf Hacker News
Es gibt bereits TypeScript-Typen für APIs, deshalb habe ich https://github.com/vega/ts-json-schema-generator gebaut, das direkt aus dem Source JSON-Schemas erzeugt.
Die Funktionsumfänge der beiden Sprachen unterscheiden sich etwas, daher gibt es auch seltsame Stellen, aber wir nutzen es seit Jahren gut. Wenn man kein TypeScript hat oder die API-Oberfläche klein genug ist, dass es okay ist, die Typen erneut zu schreiben, lohnt sich auch ein Blick auf TypeSpec. Es ist auf jeden Fall besser, als JSON-Schemas von Hand zu schreiben.
Neben dem YAML von OpenAPI sieht alles gut aus, das wirkt also fast wie Schummeln. Trotzdem halte ich OpenAPI nach wie vor für eine der besten Entwicklungen.
Andererseits habe ich schon ziemlich gehofft, dass sich TypeScript als Schema-Sprache etabliert. Genauer gesagt: der überraschend große nicht-imperative, nicht-funktionale Teil davon. Mein erster Eindruck ist ungefähr: „Was wäre, wenn man JavaScript aus TypeScript entfernt, nur die Typen für JSON übrig lässt und Metadaten zur Beschreibung von Endpoints hinzufügt, damit es zum faktischen Nachfolger von OpenAPI und WSDL wird?“
https://github.com/bufbuild/protovalidate/blob/main/examples...
Ich nutze TypeSpec seit Kurzem für APIs und suchte ein Werkzeug, mit dem man APIs ähnlich wie bei GraphQL beschreiben kann, aber mit einem Design-first-Ansatz.
Alle OpenAPI-Editoren waren viel zu träge, und die Datenbeziehungen innerhalb der API wurden nicht gut sichtbar. TypeSpec war genau das Werkzeug, nach dem ich gesucht hatte, und hat hier wirklich geholfen.
Microsoft sagt zwar, man glaube an den Wert von „Dogfooding“, also die eigenen Produkte selbst zu nutzen, aber wenn man sich das chaotische Ökosystem für native Windows-Desktopentwicklung oder die Verbreitung von Xamarin/MAUI bei Mobile-Apps ansieht, wirkt es nicht so.
Ich habe E-Mails über Microsoft Graph verwaltet, und wenn Outlook das nutzt, wäre ich ziemlich überrascht.
Da es von Microsoft kommt, wirkt es wie eine Antwort auf GraphQL. Wenn sie intern Dogfooding betreiben, könnte die Tool-Qualität einigermaßen besser sein als bei etwas, das ein Open-Source-Konsortium hastig zusammengezimmert hat.
Ich bin noch nicht überzeugt, aber es scheint das Potenzial zu haben, mehr Aufmerksamkeit zu bekommen.
GraphQL bringt viele starke Annahmen mit, etwa zu Protokoll, Fehlerbehandlung und Query-Semantik, die für den Bau konkreter Anwendungen nötig sind. Der Kern von TypeSpec ist dagegen eher eine annahmenfreie DSL zur Beschreibung von APIs. Bestimmte Protokoll-Bindings werden als Libraries hinzugefügt, und eine GraphQL-Library ist schon seit Langem etwas, das wir prüfen.
Kurz gesagt: Wenn Microsoft ein Bündel von Annahmen baut, das ähnliche Szenarien wie GraphQL löst, kann TypeSpec in diesem Kontext als API-Beschreibungssprache dienen. Aber diese Annahmen mit TypeSpec selbst gleichzusetzen, wäre nicht richtig.
Ich konnte die Kernfrage nach den unterstützten Ausgabesprachen nicht finden. Bleibt einem nur, nach OpenAPI zu exportieren und dann einen der dortigen schrecklichen Generatoren zu verwenden?
Sieht aus wie WSDL in einer TypeScript-Version.
https://en.wikipedia.org/wiki/Web_Services_Description_Langu...
Wird es WSDL überleben?
WSDL und SOAP sind in XML definiert, und SOAP beschreibt XML. Die Popularität dieser Technologien folgte dem Aufstieg und Niedergang von XML insgesamt. TypeSpec beschreibt JSON und protobuf; wenn die Popularität dieser Formate nachlässt, wird TypeSpec wahrscheinlich ebenfalls an Beliebtheit verlieren.
Heute werfen große Unternehmen lieber ihre eigene Lösung in den Markt, um ihn zu besetzen, statt zusammenzuarbeiten. Dadurch entstehen manchmal bessere Ansätze, weil ein einzelnes Team auf ein einheitliches Ziel fokussiert ist. Das ist besser, als zehn Anbieter mit jeweils eigenen Agenden zufriedenstellen zu wollen.
Es wäre schön, wenn man TypeSpec-Dateien in TypeScript oder anderen Sprachen einfach importieren und automatisch TypeScript-Typen erhalten könnte.
Codegenerierung ist umständlich und fehleranfällig.
Im Gegenteil kann sie das Debugging erleichtern, weil Fehler nicht hinter zwei Abstraktionsebenen versteckt sind. Bei generiertem Code kann man außerdem Build-Schritte hinzufügen, um Schwächen oder Bugs des Generators zu umgehen; bei anderen Ansätzen muss man sie oft einfach hinnehmen.
Den Punkt „umständlich“ verstehe ich. Direktes Feedback ist natürlich besser, als den Build erneut laufen zu lassen, daher sind die Vorteile der anderen Seite in Bereichen mit vielen Iterationen ebenfalls groß.
/openapibereitgestellt wird, auch direkt zur Laufzeit generieren.Kann YAML für die gewünschte Toolchain transformiert werden?
So wie es CORBA IDL vor 25 Jahren gemacht hat, wäre eine High-Level-IDL schön, die Schemas und Stubs für mehrere Sprachen generiert.
Das war ziemlich einfach, weil eine API bereitgestellt wird, die in OpenAPI-Dokumente konvertiert (https://github.com/mnahkies/openapi-code-generator/pull/158).
Ich konzentriere mich darauf, sowohl Client-SDKs als auch Server-Stubs zu generieren, unterstütze bisher aber nur TypeScript. Wenn ich mit der Qualität der TypeScript-Templates zufrieden bin, möchte ich irgendwann auch andere Sprachen hinzufügen.
Spezielle Sprachen sind schwer zu vermitteln und bedeuten auch für das Team, das sie entwickelt, erheblichen Mehraufwand.
Die Leute wollen keine spezielle Sprache lernen. Außerdem muss man das gesamte Sprachökosystem an Tools bauen, etwa Compiler, Dokumentation, Language Server, IDE-Integration und Dependency Management.
Ähnliche Versuche sind WaspLang und DarkLang, aber ich habe noch nicht gesehen, dass sie in der Praxis oder auf HN in nennenswertem Umfang genutzt werden. Besser ist es, bestehende Sprachen zu verwenden und sich auf den Mehrwert zu konzentrieren.
Ich habe persönlich auch an etwas mit ähnlichem Nutzen gearbeitet, nämlich „Source of Truth -> alles“, und einen Teil dieser Schmerzen selbst erlebt.
https://github.com/hofstadter-io/hof
Die Idee ist CUE + text/template = ein Generierungs-Tool, das nicht auf APIs beschränkt ist.