ES6-Exporting 类 与 typescript mixins
ES6-Exporting classes with typescript mixins
我在编写一个复杂的 class 层次结构时遇到了一个令人费解的问题,每个 class 都是从单独的 ES6 类模块文件中导出的,涉及混合。
这是一个重现我的问题的简化示例:
文件“mixinA.ts”:
type Constructor = new (...args: any[]) => {};
export default function addMixinA<TBase extends Constructor>(Base: TBase) {
return class MixedInA extends Base {
public prop1 = 1
}
}
文件“classB.ts”:
import addMixinA from "./mixinA"
class ClassB {
public prop2 = 2
}
let ClassB_WithMixin = addMixinA(ClassB)
export default ClassB_WithMixin
文件“classC.ts”:
import classB from "./classB"
class ClassC {
// 'classB' refers to a value, but is being used as a type here. Did you mean 'typeof classB'? ts(2749)
public classB_instance: classB
}
正如您在我在错误行上方添加的评论中看到的那样,在使用 classA.ts.
的导出时,文件 classC.ts 中产生了一个错误
我做错了什么吗?你能发现我的错误吗?
恭喜您获得第一个 post!
试试这个:
class ClassC {
public classB_instance: InstanceType<typeof classB> = new classB()
}
您不能使用 classB
注释字段,因为 classB
不是类型。这是一个价值。要使用此值的 type,需要 typeof
运算符 (type Foo = typeof classB
).
或者,这样做:
class ClassB_WithMixin extends addMixinA(ClassB) {}
class ClassC {
public classB_instance: ClassB_WithMixin = new ClassB_WithMixin()
}
这里的区别在于,我们不是在进行赋值 (let ClassB_WithMixin = addMixinA(ClassB)
),而是在进行继承 (class ClassB_WithMixin extends addMixinA(ClassB) {}
),这会产生一个真正的 class。而 TypeScript 中的 classes 都是类型 和 值。
我在编写一个复杂的 class 层次结构时遇到了一个令人费解的问题,每个 class 都是从单独的 ES6 类模块文件中导出的,涉及混合。
这是一个重现我的问题的简化示例:
文件“mixinA.ts”:
type Constructor = new (...args: any[]) => {};
export default function addMixinA<TBase extends Constructor>(Base: TBase) {
return class MixedInA extends Base {
public prop1 = 1
}
}
文件“classB.ts”:
import addMixinA from "./mixinA"
class ClassB {
public prop2 = 2
}
let ClassB_WithMixin = addMixinA(ClassB)
export default ClassB_WithMixin
文件“classC.ts”:
import classB from "./classB"
class ClassC {
// 'classB' refers to a value, but is being used as a type here. Did you mean 'typeof classB'? ts(2749)
public classB_instance: classB
}
正如您在我在错误行上方添加的评论中看到的那样,在使用 classA.ts.
的导出时,文件 classC.ts 中产生了一个错误我做错了什么吗?你能发现我的错误吗?
恭喜您获得第一个 post!
试试这个:
class ClassC {
public classB_instance: InstanceType<typeof classB> = new classB()
}
您不能使用 classB
注释字段,因为 classB
不是类型。这是一个价值。要使用此值的 type,需要 typeof
运算符 (type Foo = typeof classB
).
或者,这样做:
class ClassB_WithMixin extends addMixinA(ClassB) {}
class ClassC {
public classB_instance: ClassB_WithMixin = new ClassB_WithMixin()
}
这里的区别在于,我们不是在进行赋值 (let ClassB_WithMixin = addMixinA(ClassB)
),而是在进行继承 (class ClassB_WithMixin extends addMixinA(ClassB) {}
),这会产生一个真正的 class。而 TypeScript 中的 classes 都是类型 和 值。