2 回答

TA貢獻1811條經驗 獲得超6個贊
我也有Java背景,但年齡較大。;-)
一些建議:
選擇或,但您不應同時使用兩者。在下面的示例中,我使用
undefined
null
undefined
;在模塊中,靜態成員可以用簡單的變量替換;
優先于多個可選參數;
interface
您的IIFE()是無用的;
(() => { … }();
當推理就足夠了時,不要聲明類型;
首選基元類型 ( 而不是 )。
string
String
下面是一個示例:
const NAMES = ['Spring', 'Summer', 'Fall'];
const OFFSET = 2002;
const numberMap = new Map<number, Semester>();
const labelMap = new Map<string, Semester>();
export interface SemesterOptions {
semesterNumber?: number
label?: string
}
export class Semester {
private semesterNumber: number;
private label: string;
constructor({ semesterNumber, label }: SemesterOptions) {
if (semesterNumber === undefined) {
if (label === undefined) {
throw new Error('invalid options');
}
const parsed = parseLabelToSemesterOptions(label);
semesterNumber = parsed.semesterNumber;
label = parsed.label;
} else if (label === undefined) {
if (semesterNumber < 1) {
throw new Error('Semester number cannot be less than 1');
}
label = NAMES[semesterNumber % NAMES.length] + ' ' + (semesterNumber / 3 + OFFSET);
}
this.semesterNumber = semesterNumber;
this.label = label;
}
static ofNumber(semesterNumber: number): Semester {
let semester = numberMap.get(semesterNumber);
if (!semester) {
semester = new Semester({ semesterNumber });
numberMap.set(semester.semesterNumber, semester);
if (!labelMap.has(semester.label)) {
labelMap.set(semester.label, semester);
}
}
return semester;
}
static ofLabel(label: string): Semester {
let semester = labelMap.get(label);
if (!semester) {
semester = new Semester({ label });
labelMap.set(semester.label, semester);
if (!numberMap.has(semester.semesterNumber)) {
numberMap.set(semester.semesterNumber, semester);
}
}
return semester;
}
}
function parseLabelToSemesterOptions(labelToParse: string): Required<SemesterOptions> {
const tokens = labelToParse.split('\\ ');
if (tokens.length !== 2) {
throw new Error('Semester label has incorrect number of tokens');
}
const label = tokens[0];
const year = parseInt(tokens[1], 10);
if (year < OFFSET) {
throw new Error('Year cannot be earlier than ' + OFFSET);
}
const nameIndex = NAMES.indexOf(label);
if (nameIndex === -1) {
throw new Error(`Name of the semester must be one of ${NAMES.join(', ')}`);
}
const semesterNumber = (year - OFFSET) * 3 + nameIndex;
return {
semesterNumber,
label
}
}
對于 :使用獲取并測試結果是否為(或錯誤)。有一個帶有測試的快捷方式:getOrDefaultundefinedfalsy
const val = myMap.get(myKey) || myDefautValue;
...但在你的情況下,聲明更合適。if
對于 :,首先使用測試密鑰是否已存在,然后在必要時使用 set。putIfAbsent

TA貢獻1802條經驗 獲得超4個贊
關于構造函數
你猜對了,沒有像你在Java中習慣的那樣有多個構造函數(又名構造函數重載)。TypeScript 中只有一個構造函數,并且需要有可選參數。
在您的情況下,學期編號和標簽可以是未定義的或數字/字符串,無需進行類型檢查。
檢查“傳入的內容”的方法不需要在一個if語句中進行如此多的檢查。在這里看看下面的答案:https://stackoverflow.com/a/44017547/8745384
關于地圖
“putIfAb”的等價物是一個簡單的“設置(鍵,值)”
Semester.semesterMap.set(semester.semesterNumber, semester);
對于獲取或默認設置,您可以編寫
const semester: Semester = Semester.semesterMap.get(semesterNumber) || new Semester(semesterNumber);
它的作用與我之前對if語句的描述相同。檢查空值或未定義或空(如果是這種情況)執行新學期(...)。
希望我能幫忙。我最近也從 Java 切換到了類型腳本,所以也許有一種比我描述的更好的方法。
添加回答
舉報