Skip to main content

Typescript

Creating a New React App with TypeScript

npx create-react-app my-app --template typescript

Adding Typescript to an existing project

npm install --save typescript @types/node @types/react @types/react-dom @types/jest

Next, rename any file to be a TypeScript file (e.g. src/index.js to src/index.tsx)

VS Code TypeScript warnings

If you see TypeScript warnings in VS Code, try setting this…

References

Basic Component

When defining the class constructor, be sure to include the call to super(props).

Blog: ‘React.createClass’ vs ‘extends React.Component’: https://ultimatecourses.com/blog/react-create-class-versus-component

React.createClass

import * as React from "react";

const ComponentName= React.createClass({
render() {
return (
<h1>Some Content</h1>
);
}
});

export default ComponentName;

React.Component

import * as React from "react";

class ComponentName extends React.Component {
render() {
return (
<h1>Some Content</h1>
);
}
}

export default ComponentName;
import * as React from "react";

class Bookmark extends React.Component {
render() {
const url = this.props.url;

// Conditional logic that builds the <a /> tag if a url has been specified
let linkElem;

if (typeof url === "string" && url.length) {
const urlDisplayText =
typeof this.props.urlDisplayText === "string" &&
this.props.urlDisplayText.length
? this.props.urlDisplayText
: url;

linkElem = (
<a href={url} target="_blank">
{urlDisplayText}
</a>
);
}

return (
<div className="bookmark">
<h1>
Bookmark: {this.props.bookmarkTitle || "No title specified"}
</h1>
{linkElem}
</div>
);
}
}

export default Bookmark;
import * as React from "react";

class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}

render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}

ReactDOM.render(
<Clock />,
document.getElementById('root')
);

Adding Properties

import * as React from "react";
import { Component } from "react";
import PropTypes from "prop-types";

class Controls extends Component {

render() {
const { resetLabel, incrementLabel, decrementLabel, increment, decrement, resetCount } = this.props;

return (
<div className="controls">
<div onClick={() => {increment();}}>
<span>{incrementLabel}</span>
</div>
<div onClick={() => {resetCount(0);}}>
<span>{resetLabel}</span>
</div>
<div onClick={() => {decrement();}}>
<span>{decrementLabel}</span>
</div>
</div>
);
}
}

Controls.propTypes = {
increment: PropTypes.func,
decrement: PropTypes.func,
resetCount: PropTypes.func,
resetLabel: PropTypes.string,
incrementLabel: PropTypes.string,
decrementLabel: PropTypes.string,
};

Controls.defaultProps = {
resetLabel: "RESET",
incrementLabel: "+",
decrementLabel: "-"
};

export default Controls;