Are there any tools to transform a large Typescript project into Python? Maybe a transpiler or something?
Python equivalent of Typescript interface - Stack Overflow
Side project for converting Python into TypeScript
Performance difference between Python and Typescript
Videos
For the code completion and type hinting in IDEs, just add static typing for the Person and Address classes and you are already good to go. Assuming you use the latest python3.6, here's a rough equivalent of the typescript classes from your example:
Copy# spam.py
from typing import Optional, Sequence
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
def __init__(self, street: str, housenumber: int,
housenumber_postfix: Optional[str] = None) -> None:
self.street = street
self.housenumber = housenumber
self.housenumber_postfix = housenumber_postfix
class Person:
name: str
adresses: Sequence[Address]
def __init__(self, name: str, adresses: Sequence[str]) -> None:
self.name = name
self.adresses = adresses
person = Person('Joe', [
Address('Sesame', 1),
Address('Baker', 221, housenumber_postfix='b')
]) # type: Person
I suppose the boilerplate you mentioned emerges when adding the class constructors. This is indeed inavoidable. I would wish default constructors were generated at runtime when not declared explicitly, like this:
Copyclass Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
class Person:
name: str
adresses: Sequence[Address]
if __name__ == '__main__':
alice = Person('Alice', [Address('spam', 1, housenumber_postfix='eggs')])
bob = Person('Bob', ()) # a tuple is also a sequence
but unfortunately you have to declare them manually.
Edit
As Michael0x2a pointed out in the comment, the need for default constructors is made avoidable in python3.7 which introduced a @dataclass decorator, so one can indeed declare:
Copy@dataclass
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
@dataclass
class Person:
name: str
adresses: Sequence[Address]
and get the default impl of several methods, reducing the amount of boilerplate code. Check out PEP 557 for more details.
I guess you could see stub files that can be generated from your code, as some kind of interface files:
Copy$ stubgen spam # stubgen tool is part of mypy package
Created out/spam.pyi
The generated stub file contains the typed signatures of all non-private classes and functions of the module without implementation:
Copy# Stubs for spam (Python 3.6)
#
# NOTE: This dynamically typed stub was automatically generated by stubgen.
from typing import Optional, Sequence
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
def __init__(self, street: str, housenumber: int, housenumber_postfix: Optional[str]=...) -> None: ...
class Person:
name: str
adresses: Sequence[Address]
def __init__(self, name: str, adresses: Sequence[str]) -> None: ...
person: Person
These stub files are also recognized by IDEs and if your original module is not statically typed, they will use the stub file for type hints and code completion.
A TypeScript interface describes a JavaScript object. Such an object is analogous to a Python dictionary with well-known string keys, which is described by a TypedDict.
TypeScript interface example
For example the TypeScript interface:
Copyinterface Address {
street: string;
housenumber: number;
}
will describe JavaScript objects like:
Copyvar someAddress = {
street: 'SW Gemini Dr.',
housenumber: 9450,
};
Python TypedDict example
The equivalent Python TypedDict:
Copyfrom typing import TypedDict
class Address(TypedDict):
street: str
housenumber: int
will describe Python dictionaries like:
Copysome_address = {
'street': 'SW Gemini Dr.',
'housenumber': 9450,
}
# or equivalently:
some_address = dict(
street='SW Gemini Dr.',
housenumber=9450,
)
These dictionaries can be serialized to/from JSON trivially and will conform to the analogous TypeScript interface type.
Note: If you are using Python 2 or older versions of Python 3, you may need to use the older function-based syntax for TypedDict:
Copyfrom mypy_extensions import TypedDict
Address = TypedDict('Address', {
'street': str,
'housenumber': int,
})
Alternatives
There are other ways in Python to represent structures with named properties.
Data classes, available in Python 3.7, have read-write keys. However they cannot be serialized to/from JSON automatically.
Copyfrom dataclasses import dataclass
@dataclass
class Address:
street: str
housenumber: int
my_address = Address(
street='SW Gemini Dr.',
housenumber=9450,
)
Named tuples are cheap and have read-only keys. They also cannot be serialized to/from JSON automatically.
Copyfrom typing import NamedTuple
class Address(NamedTuple):
street: str
housenumber: int
my_address = Address(
street='SW Gemini Dr.',
housenumber=9450,
)
Simple namespaces, available in Python 3.3, are similar to data classes but are not very well known.
Copyfrom types import SimpleNamespace
class Address(SimpleNamespace):
street: str
housenumber: int
my_address = Address(
street='SW Gemini Dr.',
housenumber=9450,
)
attrs is a long-standing third-party library that is similar to data classes but with many more features. attrs is recognized by the mypy typechecker.
Copyimport attrs
@attr.s(auto_attribs=True)
class Address:
street: str
housenumber: int
my_address = Address(
street='SW Gemini Dr.',
housenumber=9450,
)
Hey TS community on Reddit
I am looking for some help / guidance & would be grateful for any helpful advice
So there's a project that i came across that is written in mostly typescript. However, i want to use a flask/python based front-end for it, so i need to know how can i make an API / package in Python that can call/execute typescript code from the project ?
I am not sure if my technical vocabulary is entirely correct, but basically i am looking to integrate a Typescript project in a Python front-end; by making calls to Typescript commands / calls from Python.
Would appreciate any and all help in this regard !
EDIT : I am not very proficient in Javascript or Typescript