# Comparing OpenAPI TypeScript SDK Generators
Source: https://speakeasy.com/docs/sdks/languages/typescript/oss-comparison-ts

import { Table } from "@/mdx/components";



At Speakeasy, [idiomatic SDKs](/docs/languages/philosophy) are created in a variety of languages, with generators that follow principles ensuring SDKs the best developer experience. The goal is to let developers focus on building great APIs and applications, without being distracted by hand-rolling custom SDKs just to get basic functionality.

In this post, we'll compare TypeScript SDKs managed by Speakeasy to those generated by open-source generators.

## The TypeScript SDK generator landscape

We'll compare the Speakeasy SDK generator to some popular popular open-source generators.

Our evaluation includes:

1.  The [TypeScript Fetch](https://openapi-generator.tech/docs/generators/typescript-fetch/) generator from OpenAPI Generators.
2.  The [TypeScript Node](https://openapi-generator.tech/docs/generators/typescript-node/) generator from OpenAPI Generators.
3.  [Oazapfts](https://github.com/oazapfts/oazapfts), an open-source generator with over 500 stars on GitHub.
4.  The [Speakeasy SDK generator](/docs/speakeasy-reference/cli/getting-started).

Here's the summary of how the different generators compare:

<Table
  data={[
    {
      name: "Schema validation",
      speakeasy: "✅ Using Zod",
      tsFetch: "✅ Basic",
      tsNode: "✅ Basic",
      oazapfts: "❌",
    },
    {
      name: "Documentation generation",
      speakeasy: "✅ Full docs and examples",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "OpenAPI v3.1 support",
      speakeasy: "✅",
      openapiGen: "⚠️ Beta",
      oazapfts: "❌",
    },
    {
      name: "Union types/polymorphism",
      speakeasy: "✅",
      tsFetch: "✅",
      tsNode: "❌",
      oazapfts: "✅ With discriminator",
    },
    {
      name: "Browser support",
      speakeasy: "✅",
      tsFetch: "✅",
      tsNode: "❌",
      oazapfts: "✅",
    },
    {
      name: "Tree-shaking support",
      speakeasy: "✅",
      tsFetch: "⚠️ Limited",
      tsNode: "⚠️ Limited",
      oazapfts: "⚠️ Limited",
    },
    {
      name: "OAuth 2.0",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "Retries",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "Pagination",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "React Hooks generation",
      speakeasy: "✅ With TanStack Query",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "Data streaming",
      speakeasy: "✅ With runtime docs",
      tsFetch: "✅",
      tsNode: "✅",
      oazapfts: "✅",
    },
    {
      name: "Node.js support",
      speakeasy: "✅",
      tsFetch: "✅",
      tsNode: "✅",
      oazapfts: "✅",
    },
    {
      name: "Deno support",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "Bun support",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "React Native support",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "Package publishing",
      speakeasy: "✅",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
    {
      name: "CI/CD integration",
      speakeasy: "✅ GitHub Actions",
      tsFetch: "❌",
      tsNode: "❌",
      oazapfts: "❌",
    },
  ]}
  columns={[
    { key: "name", header: "Feature" },
    { key: "speakeasy", header: "Speakeasy" },
    { key: "tsFetch", header: "TypeScript Fetch" },
    { key: "tsNode", header: "TypeScript Node" },
    { key: "oazapfts", header: "Oazapfts" },
  ]}
/>

For a detailed comparison, read on.

## Installing SDK generators

Although generator installation does not impact the resulting SDKs, your team will install the generator on each new development environment. We believe an emphasis on usability starts at home, and your internal tools should reflect this.

Install the Speakeasy CLI by running the Homebrew install command for macOS, or see the [installation instructions](/docs/speakeasy-reference/cli/getting-started) for other platforms:

```bash
brew install speakeasy-api/tap/speakeasy
```

Installing `openapi-generator` using Homebrew installs `openjdk@11` and its numerous dependencies:

```bash
brew install openapi-generator
```

Installing oazapfts is easiest done as an Node.js module with NPM or similar:

```bash