Преобразован класс javascript в класс машинописи: некоторые свойства не видны - PullRequest
1 голос
/ 03 мая 2020

У меня есть класс javascript в проекте, который я хочу преобразовать в машинописный текст:

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)

Здесь у меня есть две ошибки:

  • Свойство 'PeakTimeMultiplier' не существует для типа 'typeof PricePlan'
  • Свойство 'DayOfWeek' не существует для типа 'typeof PricePlan'

Это свойства, которые я переместил в класс. Как я могу сделать их видимыми?

1 Ответ

1 голос
/ 04 мая 2020

Самый быстрый способ исправить вашу сборку - просто объявить DayOfWeek и PeakTimeMultiplier как 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...