【问题标题】:Converted javascript class to typescript class: some properties are not visible将 javascript 类转换为 typescript 类:某些属性不可见
【发布时间】:2020-05-04 05:03:12
【问题描述】:

我在一个项目中有一个 javascript 类,我想将其转换为 typescript:

class PricePlan {

    constructor(name, supplier, unitRate, peakTimeMultipliers) {
        this.name = name
        this.supplier = supplier
        this.unitRate = unitRate
        this.peakTimeMultipliers = peakTimeMultipliers
    }

    getPrice(dateTime) {
        let peakMultiplier = this.peakTimeMultipliers.find(multiplier => {
            return multiplier.day === dateTime.getDay()
        });
        return peakMultiplier ? peakMultiplier.multiplier : this.unitRate;
    }
}

PricePlan.DayOfWeek = Object.freeze({
    Sunday:0,
    Monday:1,
    Tuesday:2,
    Wednesday:3,
    Thursday:4,
    Friday:5,
    Saturday:6
})

PricePlan.PeakTimeMultiplier = class {
    constructor(dayOfWeek, multiplier) {
        this.day = dayOfWeek
        this.multiplier = multiplier
    }
}

module.exports = PricePlan

我已将该类更改为这样的打字稿类:

export class PricePlan {
    private name;
    private supplier;
    private unitRate;
    private peakTimeMultipliers

    constructor(name, supplier, unitRate, peakTimeMultipliers = false) {
        this.name = name
        this.supplier = supplier
        this.unitRate = unitRate
        this.peakTimeMultipliers = peakTimeMultipliers
    }

    getPrice(dateTime) {
        let peakMultiplier = this.peakTimeMultipliers.find(multiplier => {
            return multiplier.day === dateTime.getDay()
        });
        return peakMultiplier ? peakMultiplier.multiplier : this.unitRate;
    }

    DayOfWeek = {
        Sunday: 0,
        Monday: 1,
        Tuesday: 2,
        Wednesday: 3,
        Thursday: 4,
        Friday: 5,
        Saturday: 6
    }

    PeakTimeMultiplier = class {
        private day
        private multiplier

        constructor(dayOfWeek, multiplier) {
            this.day = dayOfWeek
            this.multiplier = multiplier
        }
    }
}

现在没有编译器错误,但该类在测试中被这样调用:

let peakTimeMultiplier = new PricePlan.PeakTimeMultiplier(PricePlan.DayOfWeek.Wednesday, 10)

这里有两个错误:

  • “typeof PricePlan”类型上不存在属性“PeakTimeMultiplier”
  • “typeof PricePlan”类型上不存在属性“DayOfWeek”

这些是我在类中移动的属性。如何让它们可见?

【问题讨论】:

  • 它们必须是静态的。

标签: typescript


【解决方案1】:

修复构建的最快方法是将 DayOfWeekPeakTimeMultiplier 声明为 static 。有时将它们重构为这样的命名空间会更干净:

export class PricePlan {
    private name;
    private supplier;
    private unitRate;
    private peakTimeMultipliers

    constructor(name, supplier, unitRate, peakTimeMultipliers = false) {
        this.name = name
        this.supplier = supplier
        this.unitRate = unitRate
        this.peakTimeMultipliers = peakTimeMultipliers
    }

    getPrice(dateTime) {
        let peakMultiplier = this.peakTimeMultipliers.find(multiplier => {
            return multiplier.day === dateTime.getDay()
        });
        return peakMultiplier ? peakMultiplier.multiplier : this.unitRate;
    }  
}

export namespace PricePlan {
  export const enum DayOfWeek {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    }

    export class PeakTimeMultiplier {
        private day
        private multiplier

        constructor(dayOfWeek, multiplier) {
            this.day = dayOfWeek
            this.multiplier = multiplier
        }
    }
}

看到DayOfWeek 也被声明为enum

【讨论】:

    猜你喜欢
    • 2023-02-05
    • 2016-07-30
    • 2023-03-29
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2020-05-27
    • 2013-07-29
    相关资源
    最近更新 更多