I have a Java class which class I want to use in typescript project. But I tried to convert it and took help from http://www.jsweet.org/jsweet-live-sandbox/ also. I am very new in typescript, I am a java developer and currently learning fronted language. So I am facing problem to identify the error. It will very helpful if you help me to fix my typescript code.
Here is my Java class:
import bd.edu.seu.erp.model.exception.IncorrectSemesterError;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Semester {
private static final String NAMES[] = {"Spring", "Summer", "Fall"};
private static final int OFFSET = 2002;
private static Map<Integer, Semester> semesterMap = new HashMap<>();
private static Map<String, Semester> semesterNameMap = new HashMap<>();
private int semesterNumber;
private String label;
public Semester(int semesterNumber, String label) {
this.semesterNumber = semesterNumber;
this.label = label;
}
private Semester(int semesterNumber) {
if (semesterNumber < 1)
throw new IncorrectSemesterError("Invalid Semester", "Semester number cannot be less than 1");
this.semesterNumber = semesterNumber;
this.label = NAMES[semesterNumber % NAMES.length] + " " + (semesterNumber / 3 + OFFSET);
}
private Semester(String semesterName) {
this.label = semesterName;
String[] tokens = semesterName.split("\\ ");
if (tokens.length != 2)
throw new IncorrectSemesterError("Invalid Semester", "Semester label has incorrect number of tokens");
String name = tokens[0];
int year = Integer.parseInt(tokens[1]);
if (year < OFFSET)
throw new IncorrectSemesterError("Invalid Semester", "Year cannot be earlier than " + OFFSET);
int nameIndex = Arrays.asList(NAMES).indexOf(name);
if (nameIndex < 0 || nameIndex > NAMES.length)
throw new IncorrectSemesterError("Invalid Semester", "Name of the semester must be one of [Spring, Summer, Fall]");
this.semesterNumber = (year - OFFSET) * 3 + nameIndex;
}
public static Semester of(int semesterNumber) {
Semester semester = semesterMap.getOrDefault(semesterNumber, new Semester(semesterNumber));
semesterMap.putIfAbsent(semester.semesterNumber, semester);
semesterNameMap.putIfAbsent(semester.label, semester);
return semester;
}
public static Semester of(String semesterName) {
Semester semester = semesterNameMap.getOrDefault(semesterName, new Semester(semesterName));
semesterMap.putIfAbsent(semester.semesterNumber, semester);
semesterNameMap.putIfAbsent(semester.label, semester);
return semester;
}
/*
public static Semester of(Semester semesterObject) {
Semester semester = semesterNameMap.getOrDefault(semesterObject.semesterNumber, new Semester(semesterObject.semesterNumber));
semesterMap.putIfAbsent(semester.semesterNumber, semester);
semesterNameMap.putIfAbsent(semester.label, semester);
return semester;
}
*/
}
Here is my typescript file what I tried:
export class Semester {
static NAMES: string[] = ['Spring', 'Summer', 'Fall'];
static OFFSET = 2002;
static semesterMap: Map<number, Semester> = new Map();
static semesterNameMap: Map<String, Semester> = new Map();
private semesterNumber: number;
private label: String;
public constructor(semesterNumber?: number, label?: String) {
if (((typeof semesterNumber === 'number') || semesterNumber === null) && ((typeof label === 'string') || label === null)) {
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
(() => {
this.semesterNumber = semesterNumber;
this.label = label;
})();
} else if (((typeof label === 'string') || semesterNumber === null) && semesterNumber === undefined) {
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
(() => {
const tokens: string[] = label.split('\\ ');
if (tokens.length !== 2) {
throw new Error('Semester label has incorrect number of tokens');
}
const name: string = tokens[0];
const year: number = parseInt(tokens[1], 10);
if (year < Semester.OFFSET) {
throw new Error('Year cannot be earlier than ' + Semester.OFFSET);
}
const nameIndex: number = Semester.NAMES.slice(0).indexOf(name);
if (nameIndex < 0 || nameIndex > Semester.NAMES.length) {
throw new Error('Name of the semester must be one of [Spring, Summer, Fall]');
}
this.semesterNumber = (year - Semester.OFFSET) * 3 + nameIndex;
})();
} else if (((typeof semesterNumber === 'number'))) {
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
if (this.semesterNumber === undefined) {
this.semesterNumber = 0;
}
if (this.label === undefined) {
this.label = null;
}
(() => {
if (semesterNumber < 1) {
throw new Error('Semester number cannot be less than 1');
}
this.semesterNumber = semesterNumber;
this.label = Semester.NAMES[semesterNumber % Semester.NAMES.length] + ' ' + (semesterNumber / 3 + Semester.OFFSET);
})();
} else {
throw new Error('invalid overload');
}
}
public static of(semesterNumber?: number, semesterName?: string): Semester {
if (typeof semesterNumber === 'number') {
const semester: Semester = Semester.semesterMap.getOrDefault(semesterNumber, new Semester(semesterNumber));
Semester.semesterMap.putIfAbsent(semester.semesterNumber, semester);
Semester.semesterNameMap.putIfAbsent(semester.label, semester);
return semester;
}
if (typeof semesterName === 'string') {
const semester: Semester = Semester.semesterNameMap.getOrDefault(semesterName, new Semester(semesterName));
Semester.semesterMap.putIfAbsent(semester.semesterNumber, semester);
Semester.semesterNameMap.putIfAbsent(semester.label, semester);
return semester;
}
}
}
First of all, I have confusion in typescript constructor. I am not sure, is it the correct way what I wrote for multiple constructor in java. Second, in typescript I didn't find getOrDefault, putIfAbsent in Map. I didn't understand what should write here.
Can you please help me to fix this typescript code? Thanks in advance.