我已经在Typescript中创建了一个通用类,以扩展从构造函数中传递的对象开始的对象(通过Proxy,它将在构造函数中返回)。
class MyClass<T> {
private _a: 5;
constructor(source: T) {
...
return new Proxy(Object.assign(this, source), { ... });
}
}
如果我要实例MyClass
,我将这样做:
interface DeepObject {
a: number,
b: {
c: number,
d: { ... }
}
}
const x = new MyClass<DeepObject>({
a: 1,
b: {
c: 2,
d: { ... }
}
});
因此,结果是,我将x作为具有内部“ DeepObject”属性的类,例如a
,b
,b.d
。但是,如果我尝试访问x.b.d
,它显然将无法识别新属性,因为它们会在当前状态下在运行时被推入内部。
知道我要返回经过编辑的“ this”(MyClass +新道具),是否可以使用MyClass的T
参数作为类返回类型?
我试图将其设置为构造函数,但打字稿不允许我这样做,例如
constructor(source: T): ThisType<MyClass<T>> & T { ... }
constructor(source: T): MyClass<T> & T { ... }
此外,在多行中使用//@ts-ignore
(例如
//@ts-ignore
x.b.c = 5;
//@ts-ignore
x.b.d.f = 9;
),是对打字稿功能(恕我直言)的误用。
同样是将[key: string]: any
放在类中,属性上方或下方。
非常感谢您!
答案 0 :(得分:1)
您不能直接收取构造函数的返回类型。但是,您可以使用与Proxy
usses相同的方法,并为构造函数使用单独的声明,该声明在return
class _MyClass<T> {
private _a: 5;
constructor(source: T) {
return new Proxy(Object.assign(this, source), { ... });
}
}
interface DeepObject {
a: number,
b: {
c: number,
d: { }
}
}
const MyClass : {
new<T> (s:T) : _MyClass<T> & T
} = _MyClass as any
const x = new MyClass<DeepObject>({
a: 1,
b: {
c: 2,
d: { }
}
});
x.b.c