TypeScript:基于构造函数参数扩展“this”

toe95027  于 2022-12-30  发布在  TypeScript
关注(0)|答案(1)|浏览(148)

我正在尝试向一个类添加类型,这个类在构造函数中扩展了“this”。
我在Typescript: extending "this" inside class中看到了这个问题,但是我事先不知道哪个对象会传递给构造函数。

class Baz<T extends object> {
    public test;
    constructor(props: T) {
        Object.assign(this, props);
    }
}

interface IFoo {
  foo: number;
}

const p = new Baz<IFoo>({foo: 1});
p.test;
p.foo; // Not recognized.

我试图将作为对象传递的字段识别为属性。

mzsu5hc0

mzsu5hc01#

我不认为你可以用构造函数和泛型类来做这件事。你可以在类上使用泛型类型参数来影响数据成员的类型或者方法的参数或返回类型,但是不能给类本身添加特性。
不过,您可以使用静态方法(或者只是一个独立函数)来完成此操作:

class Baz {
    public test: string = "something";

    private constructor() { // If you want it to be private; that's up to you
    }

    static create<T extends object>(props: T): Baz & T {
        const b = new Baz();
        Object.assign(b, props);
        return b as Baz & T;
    }
}

interface IFoo {
    foo: number;
}

const p = Baz.create<IFoo>({ foo: 1 });
p.test;
p.foo; // <== Works fine

Playground示例

相关问题