打字稿中的三阶嵌套 类
3rd order nested classes in typescript
Edit 1, just made it a little shorter, same code as before tho
只是想说它可能看起来像很多代码,但实际上都是空的。
所以我想创建一个嵌套的 class 结构,如下所示:
let a = new A();
let b = new A.B();
let c = new A.B.C();
// etc
问题是 typescript 通过不同的方式来创建嵌套的 classes 一直在与我斗争。一种看起来非常有前途和优雅的方法,我将其称为 prototype
或 type
嵌套 classes 的方法。
type
方法的问题在于,它无法扩展到嵌套的 classes 的三阶,意思是 class C
inside class B
里面 class 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
方法会给我这些错误?它们看起来很奇怪,我不知道为什么 ANYTHING 在这种情况下会成为循环引用。
喜欢这个作品吗?
class C {}
class B {
static C = C
}
class A {
static B = B
}
Edit 1, just made it a little shorter, same code as before tho
只是想说它可能看起来像很多代码,但实际上都是空的。
所以我想创建一个嵌套的 class 结构,如下所示:
let a = new A();
let b = new A.B();
let c = new A.B.C();
// etc
问题是 typescript 通过不同的方式来创建嵌套的 classes 一直在与我斗争。一种看起来非常有前途和优雅的方法,我将其称为 prototype
或 type
嵌套 classes 的方法。
type
方法的问题在于,它无法扩展到嵌套的 classes 的三阶,意思是 class C
inside class B
里面 class 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
方法会给我这些错误?它们看起来很奇怪,我不知道为什么 ANYTHING 在这种情况下会成为循环引用。
喜欢这个作品吗?
class C {}
class B {
static C = C
}
class A {
static B = B
}