我正在使用 Typescript/Javascript 中的嵌套類來模擬 Java 中的可能性。這作業得很好。我可以有靜態和非靜態嵌套類,相互派生等等。這是我的測驗宣告:
class OuterClass {
public static InnerClass2 = class InnerClass2 {
public static InnerClass3 = class InnerClass3 {
};
public update(o: OuterClass): void {
o.a = "b";
}
};
public InnerClass1 = (($outer) => {
class InnerClass1 {
public static InnerClass3 = class InnerClass3 {
};
public update(): void {
$outer.a = "b";
}
}
return InnerClass1;
})(this);
public InnerClassDerived = (($outer) => {
class InnerClass extends this.InnerClass1 {
public constructor() {
super();
this.update();
}
}
return InnerClass;
})(this);
private a = "a";
private list: Array<InstanceType<typeof this.InnerClass1>> = [];
public test(): void {
const i = new this.InnerClass1();
this.list.push(i);
i.update();
}
}
然而,令我困擾的是這一行:
private list: Array<InstanceType<typeof this.InnerClass1>> = [];
因為陣列的型別描述很長。如果InnerClass1是靜態的,我可以在單獨的命名空間中為它定義一個型別,例如 for InnerClass2:
export namespace OuterClass {
export type InnerClass2 = InstanceType<typeof OuterClass.InnerClass2>;
}
但這是不可能的,因為我需要那個this限定符。據我所知,類中的區域型別定義是不可能的,那么一個可能的解決方案如何避免陣列型別宣告中的冗長型別呢?
理想情況下,我想擁有這個:
private list: this.InnerClass1[] = [];
uj5u.com熱心網友回復:
你非常接近解決方案。您應該回傳一個類運算式,而不是回傳工廠類屬性中的類定義。然后,您可以訪問InnerClass1via的型別OuterClass["InnerClass1"]
class OuterClass {
public static InnerClass2 = class InnerClass2 {
public static InnerClass3 = class InnerClass3 {
};
public update(o: OuterClass): void {
o.a = "b";
}
};
public InnerClass1 = (($outer) => {
return class InnerClass1 {
public static InnerClass3 = class InnerClass3 {
};
public update(): void {
$outer.a = "b";
}
};
})(this);
public InnerClassDerived = (($outer) => {
return class InnerClass extends this.InnerClass1 {
public constructor() {
super();
this.update();
}
}
})(this);
private a = "a";
private list: Array<OuterClass.classes.InnerClass1> = [];
public test(): void {
const i = new this.InnerClass1();
this.list.push(i);
i.update();
}
}
export declare namespace OuterClass {
export namespace classes {
export type InnerClass1 = InstanceType<OuterClass["InnerClass1"]>;
export type InnerClass2 = InstanceType<typeof OuterClass["InnerClass2"]>;
}
}
TypeScript Playground 鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442529.html
標籤:打字稿
下一篇:不能使用命名空間“API”作為值
