Opinion: Don’t use class for data structure in typescript (2019). Use interface only

Always use interfaces instead

Problems of class:

  • Lots of frameworks such as Redux don’t support class instances. They only support plain objects. There are tools that can convert plain objects to class instances, but the point below makes it awkward.
  • Given a variable “someType: SomeType” in the code, you don’t know if it is a plain object or a class instance. So you don’t know if you can call its methods, or if it is OK to call plainToClass() to convert it to a class instance.

Use spring +aspectj in Spring boot

public class YourApplication ...{
public class YourAspect {

	@Before("execution(public * com..*Manager.*(..))")
	public void doAdvice(JoinPoint joinPoint) {...}

Enable google analytics with react-router

One way of doing this is to create your own Router class, which extends the one from the framework; and inside this Router class you put in the tracking logic:

class MyRouteComponent extends React.Component<Props, State> {

    constructor(props: Props) {
        this.state = {currentUserRefreshed: false};

        if (isProdEnv()) {

    trackPage(pageUrl:string) {
        ReactGA.set({page: pageUrl});

    toPageUrl(location: Location) {
        return location.pathname + location.search;

    componentDidMount() {

        if(isProdEnv() && this.props.location){

    render() {

My first react HOC + Redux component in Typescript

The logic: Show a component only if the user logged in

import React from 'react';
import {connect} from "react-redux";

interface AuthenticatedUserOnlyProps {
    authenticated: boolean

function mapStateToProps(state: State) {    
    return {
        authenticated: state.authenticated

export function authenticatedUserOnly<T>(WrappedComponent: React.ComponentType<T>) {
    class FinalComponent extends React.Component<AuthenticatedUserOnlyProps > {
        public render() {

            const {authenticated, ...otherProps} = this.props;
            if (authenticated) {
                return <WrappedComponent {...(otherProps as T)}/>
            } else {
                return null;

    return connect(mapStateToProps, null)(FinalComponent);

To use it, just

render() {
    const someComponent = authenticatedUserOnly(SomeComponent); 

    return {
           {someComponent }

Springfox for 204 response

What you need to,

  • Return ResponseEntity<Void>
  • Set the @ResponseStatus for your rest controller’s method

If you don’t do that, you will get ResponseEntity as the response class in your swagger json, and you will get both 200 and 204 as your successful response code, which is not correct because your method only returns 204, no 200.

    @RequestMapping(value = "...", method = RequestMethod.POST)
    @ApiOperation(value = "...")
    @ApiResponses(value = {
            @ApiResponse(code = 204, message = "success")
    public ResponseEntity<Void> someMethod(){}

IOS Safari showing a blank page when coming back to a React Component


When you go to a react component, then go to another, and finally come back, the react component is showing blank, or half-blank.


If you inspect the page with the mobile safari inspector , you can see the elements are there, but safari just refuse to show the data on the screen.

In my case, this seems to be related with data reloading when I come back to the component. It reloads the data in its componentDidAmount() then re-render. Safari may not perform well enough to handle this kind of re-rendering.


A workaround is to not reload the data when you come back to the component. You can do this by checking if the data exists, and only loads the data if not existing.

It comes with a price: when you come back to the component, you are not seeing the data that’s up-to-data. There are a few things you can do to make it up:

  • A delayed data re-loading
  • Always reload the data 24 hours (e.g.) after last data loading
  • Very important: destroy the data if a user logs out to make sure a different user won’t see the first user’s data

Jetty’s start.jar forks a new JVM to run the app if logback module is enabled

Jetty is too smart. If there is any JVM option provided, Jetty will spawn a new JVM instance to do the real work, even if you don’t use “–exec” option in start.ini

And jetty’s logback module introduces a JVM option. See here

You will see:


So does it matter?

It matters a lot because all the JVM options you passed to start.jar will stay on the process of start.jar. They are not passed to the forked JVM process.

What’s the solution ?

Since you have to let it fork a new JVM because of logback, you can just put all the JVM options in start.ini. Like,


Miscellaneous tips while developing in WSL (Windows Subsystem for Linux)

File change monitoring doesn’t work, such as the auto-refresh of create-react-app

Use the following before your "npm start" or put it on env file:


And if you are using Intellij, you need to explicitly "ctrl + s" to save the changes on your code files

Integrate beyond compare with git diff

export TMPDIR='/mnt/c/Users/yourName/AppData/Local/Temp'
alias gitdiff='git difftool -y --no-symlinks &'
#In your ~/.gitconfig  , add the following

            tool = BCompare
[difftool "BCompare"]
            path = "/mnt/c/Program Files/Beyond Compare 4/BCompare.exe"
            cmd = \"/mnt/c/Program Files/Beyond Compare 4/BCompare.exe\" -expandall \"`echo $LOCAL | sed 's_/mnt/c_C:_'`\" \"`echo $REMOTE | sed 's_/mnt/c_C:_'`\"

To run it,

$ gitdiff

Install terminator

Click here