Skip to main content

A script to generate TypeScript interfaces from Python dataclasses, with enum support.

Project description

py-to-ts-interfaces

Python to TypeScript Interfaces

What is this?

A script for converting Python dataclasses with type annotations to TypeScript interfaces. This is a very similar project to py-ts-interfaces, and only exists because that project does not currently support enums. This is a utility for another project I am working on, and has the additional benefit of allowing me to generate the TypeScript output in compliance with my eslint configuration. This is a much more primitive approach compared to py-ts-interfaces which comes with certain limitations (see Usage for details).

Installation

python --version  # requires 3.9+
pip install py-to-ts-interfaces

Motivation

Just like py-ts-interfaces, this script is intended for cases where a web application is composed of a Python server and a TypeScript client. Setting up a language translator like this means that it is possible to define the message schemas once (in Python), and then guarantee that the TypeScript message schemas are in sync with the Python ones. This avoids the annoying task of maintaining two definition sets, and more importantly, bugs caused by forgetting to update both interfaces.

Usage

This script takes a single input folder, and requires that all python files inside only contain the following:

  • Module imports
  • Newlines
  • Spaces
  • Dataclasses
  • Enums
  • String definitions

If a dataclass contains an enum, the enum definition must be in the same folder also. This script also supports nullable types (see MyNullableInterface in the section below). Functions in Enum definitions will be ignored (e.g. a __str__ override).

Example

  1. Write your Python definitions.
from dataclasses import dataclass
from enum import Enum
from typing import Final, Union, List, Dict, Optional

class MyEnum(Enum):
    FIRST = "Number One"
    SECOND = "Number Two"

    def __str__(self):
        return self.value

CONSTANT_STRING: Final = "example"
OTHER_STRING = "another example"

@dataclass(frozen=True)
class MyInterface:
    field: MyEnum
    
@dataclass(frozen=True)
class MyNullableInterface:
    field: Union[MyInterface, None] = None
    otherField: Optional[MyInterface] = None
    
@dataclass(frozen=True)
class MyInterface2:
    strange_type: Optional[List[int]]
    other_type: List[str]
    dict_type: Dict[int, Dict[str, MyEnum]]
  1. In your shell, run the included command and pass in the path of the folder containing the files you want to convert, and the path to the folder that the output should be written to. If the output folder path does not exist then it will be created automatically.
$ py-ts-interfaces example_folder output_folder
  1. The resulting file will look like this:
export enum MyEnum {
    FIRST = 'Number One',
    SECOND = 'Number Two',
}

export const CONSTANT_STRING = 'example';
export const OTHER_STRING = 'another example';

export interface MyInterface {
    field: MyEnum;
}

export interface MyNullableInterface {
    field?: MyInterface;
    otherField?: MyInterface;
}

export interface MyInterface2 {
    strangeType?: number[];
    otherType: string[];
    dictType: Record<number, Record<string, MyEnum>>;
}

Supported Type Mappings

Python Typescript
str string
int number
float number
complex number
bool boolean
List[T] T[]
Dict[T, P] Record<T, P>

Where T and P are one of the listed supported types (this includes nested Dicts), or enums.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py-to-ts-interfaces-1.4.0.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

py_to_ts_interfaces-1.4.0-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file py-to-ts-interfaces-1.4.0.tar.gz.

File metadata

  • Download URL: py-to-ts-interfaces-1.4.0.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.4

File hashes

Hashes for py-to-ts-interfaces-1.4.0.tar.gz
Algorithm Hash digest
SHA256 cce512f864b44695bef5dc565acb480428c84af3dacfeb4984f7a3c19cd5b384
MD5 e0fc26f7e79f14a27be5121e3f55f0fe
BLAKE2b-256 98682517a347ccf1f47d9891175d56b2b5a589495738febcef1858cf4862fc92

See more details on using hashes here.

File details

Details for the file py_to_ts_interfaces-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: py_to_ts_interfaces-1.4.0-py3-none-any.whl
  • Upload date:
  • Size: 9.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.4

File hashes

Hashes for py_to_ts_interfaces-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1dda93edda72e2ccbfedab66df6ab9afd978bacb5fe490c870776731e3193442
MD5 c8d33e0da9c2996539bf5078f861e6e7
BLAKE2b-256 9ffe005b601b5d79005ec0b1b673372ef4c47df6c7ae94b4f4f81b536ce7859b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page