亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復從Java轉換后的類型腳本類文件錯誤?

如何修復從Java轉換后的類型腳本類文件錯誤?

長風秋雁 2022-09-28 10:16:18
我有一個Java類,我想在類型腳本項目中使用的哪個類。但我試圖轉換它,并得到了 http://www.jsweet.org/jsweet-live-sandbox/ 的幫助。我對類型腳本非常陌生,我是一名Java開發人員,目前正在學習前端語言。所以我面臨著識別錯誤的問題。如果您幫助我修復我的類型腳本代碼,那將非常有幫助。這是我的 Java 類: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);    }首先,我在類型腳本構造函數中感到困惑。我不確定,這是我在java中為多個構造函數編寫的正確方法嗎?其次,在打字稿中,我沒有找到“或”默認值“,在”地圖“中放置”。我不明白這里應該寫些什么。你能幫我修復這個打字機代碼嗎?提前致謝。
查看完整描述

2 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我也有Java背景,但年齡較大。;-)

一些建議:

  • 選擇或,但您不應同時使用兩者。在下面的示例中,我使用undefinednullundefined;

  • 在模塊中,靜態成員可以用簡單的變量替換;

  • 優先于多個可選參數;interface

  • 您的IIFE()是無用的;(() => { … }();

  • 當推理就足夠了時,不要聲明類型;

  • 首選基元類型 ( 而不是 )。stringString

下面是一個示例:

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


查看完整回答
反對 回復 2022-09-28
?
慕虎7371278

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 切換到了類型腳本,所以也許有一種比我描述的更好的方法。


查看完整回答
反對 回復 2022-09-28
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號