Вложенные классы 3-го порядка в машинописи - PullRequest
0 голосов
/ 12 апреля 2020

Редактировать 1, просто сделал его немного короче, тот же код, что и раньше,

Просто хотел сказать, что он может выглядеть как много кода, но все это довольно пусто.


Итак, я хотел создать структуру вложенных классов, которая бы выглядела так:

let a = new A();
let b = new A.B();
let c = new A.B.C();
// etc

Проблема в том, что машинопись продолжала бороться со мной различными способами создания вложенных классов. Один метод, который выглядел очень многообещающе и изящно и который я собираюсь назвать prototype или type метод выполнения вложенных классов.

Проблема с методом type заключается в том, что он не не масштабируются до вложенных классов 3-го порядка, то есть класс C внутри класса B внутри класса A.

class A {
    // error TS7022: 'B' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
    public static B = class {
        public static C = class { public constructor(name : string) { } }
        // error TS2502: 'c' is referenced directly or indirectly in its own type annotation.
        public c : A.B.C;
        public constructor(c : A.B.C) { this.c = c; }
    }

    public b : A.B; public constructor(b : A.B) { this.b = b; }
}

namespace A {
    export type B = InstanceType<typeof A.B>;
    // error TS2456: Type alias 'C' circularly references itself.
    export namespace B { export type C = InstanceType<typeof A.B.C>; }
}

export { A };

Так что это не работает, и я потратил последние 8 часов, пытаясь выяснить, почему это не работает, и я до сих пор понятия не имею, почему. Затем я нашел другой метод (он уродливее, но при расширении он не доставляет проблем), который я собираюсь назвать методом namespace, который выглядит следующим образом:

class A { public b : A.B; public constructor(b : A.B) { this.b = b; } }

namespace A {
    export class B { public c : A.B.C; public constructor(c : A.B.C) { this.c = c; } }
    export namespace B { export class C { public constructor() { } } }
}

export { A };

На мой актуальный вопрос я может полностью работать с методом namespace, какого черта метод type дает мне эти ошибки? Они выглядят довольно странно, и я понятия не имею, почему НИЧЕГО будет круговой ссылкой в ​​этом контексте.

1 Ответ

0 голосов
/ 12 апреля 2020

Хотелось бы что-нибудь эту работу?

class C {}
class B {
    static C = C
}
class A {
    static B = B
}
...