在类Typescript类型中允许任意属性

时间:2019-02-17 19:31:06

标签: typescript typescript-typings

我已经在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”属性的类,例如abb.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放在类中,属性上方或下方。

非常感谢您!

1 个答案:

答案 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