1.5.5 • Published 6 years ago
typescript-transform-jsx v1.5.5
typescript-transform-jsx
Typescript transform jsx to string
Table of Contents
Motivation
- Typesafe templates
- Transform jsx to string in compilation time
- Fast runtime
See examples
Install
$ npm i -D typescript-transform-jsxUsage with ttypescript
Add it to plugins in your tsconfig.json
{
"compilerOptions": {
"jsx": "react-native",
"plugins": [{ "transform": "typescript-transform-jsx" }]
}
}See https://github.com/LeDDGroup/typescript-transform-jsx/tree/master/examples/example-ttypescript
Setup
Set the jsx flag to react-native or preserve in your tsconfig file. Then create a types.ts with the following content:
declare namespace JSX {
type Element = string;
interface ElementChildrenAttribute {
children: any;
}
interface IntrinsicElements {
[element: string]: {
[property: string]: any;
};
}
}This will declare custom JSX so you don't need react typings.
Example
interface Person {
name: string;
age: number;
}
const App = (props: { persons: Person[] }) => (
<ul>
{props.persons.map(person => (
<li>
{person.name} is {person.age} years old
</li>
))}
</ul>
);Gets compiled to:
const App = props =>
`<ul>${props.persons
.map(person => `<li>${person.name} is ${person.age} years old</li>`)
.join("")}</ul>`;Roadmap/Caveats
Always handle
childrenproperty implicitlySelf closing tags will be treated as such, (ie no children handling on the props)
Using spread operators on html elements require esnext environment because it compiles down to
Object.entriesexpression:
// input
const props = { class: "container" };
<div {...props} />;
// output
const props = { class: "container" };
`<div ${Object.entries(...props).map(
([key, value]) => `${key}="${value}"`
)}></div>`;Contributing
If you have any question or idea of a feature create an issue in github or make an PR.