Слишком комплексные вложенные классы

Рейтинг: 0Ответов: 1Опубликовано: 12.08.2025

Описание

Недавно открыл для себя способ создания вложенных классов в TypeScript:

type OuterInner = InstanceType<typeof Outer.Inner>;

//#region Outer
class Outer {
    //#region Inner
    static Inner = class OuterInner {
        innerPublicMethod(): void {
            Outer.#outerPrivateMethod();
        }
    };
    //#endregion

    static #outerPrivateMethod(): void { }
}
//#endregion

const inner: OuterInner = new Outer.Inner();
inner.innerPublicMethod();

export type { OuterInner };
export { Outer };

И совсем уж недавно (вчера) открыл его побочный эффект: так как определение вложенных классов происходит неявно...

... (способ явного определения лично я не нашел) то при сложной структуре вложенного класса получаем ошибку

The inferred type of this node exceeds the maximum length the compiler will serialize. An explicit type annotation is needed.

Вопрос

  • Если я делаю класс не вложенным, я теряю доступ к приватным членам класса.
  • Если я делаю класс вложенным, я получаю ошибку, с которым не знаю как поступить.

Что мне делать?

Ответы

▲ 1Принят

Ответ

Следуя советам участника MoloF нашел правильный подход к этой конструкции.

//#region Outer
interface OuterInner {
    innerPublicMethod(): void;
}

interface OuterInnerConstructor {
    new(): OuterInner;
}

class Outer {
    //#region Inner
    static Inner: OuterInnerConstructor = class Inner implements OuterInner {
        innerPublicMethod(): void {
            Outer.#outerPrivateMethod();
        }
    };
    //#endregion

    static #outerPrivateMethod(): void { }
}
//#endregion

export type { OuterInner, OuterInnerConstructor };
export { Outer };

И комплексные классы не жалуются.