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

TypeScript: extend "this" based on constructor parameters

提问人:user2342561 提问时间:12/28/2022 更新时间:12/28/2022 访问量:198

问:

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

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.

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

TypeScript 类型 如下

评论

0赞 T.J. Crowder 12/28/2022
请确保您共享的代码仅包含与您的实际问题相关的错误。上缺少类型和初始值设定项。test
0赞 user2342561 12/28/2022
你是对的。事实上,这并不重要......它只是为了表明我可以访问类的属性(当然),但不能访问构造函数中分配的属性(testfoo)

答:

1赞 T.J. Crowder 12/28/2022 #1

我不认为你可以用构造函数和泛型类来做到这一点。可以在类上使用泛型类型参数来影响数据成员的类型或方法的参数或返回类型,但不能向类本身添加功能。

不过,您可以使用静态方法(或只是一个独立函数)来完成:

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 示例

评论

0赞 user2342561 12/28/2022
我正在向现有的 javascript 代码库添加类型。那么唯一的方法就是更改代码?我觉得有点不幸......
0赞 T.J. Crowder 12/28/2022
@user2342561 - 人们在 JavaScript 中使用的某些模式不能很好地映射到 TypeScript 的类型系统。我相当确定这是其中之一。恕我直言,那里的东西在语义上已经不对劲了——代码说,但你得到的不是 ,而是 .我不认为 TypeScript 有办法使用构造函数来表达这一点。所以是的,你要么必须更改代码,要么在你做任何事情的地方使用类型断言(),这似乎需要更多的工作。new BazBazBaz + ____new Baz(/*...*/) as Baz & ____