如何以正确的方式动态设置对象的属性?

时间:2017-11-30 19:19:02

标签: javascript typescript ecmascript-6

我正在使用打字稿。我想知道如何动态设置对象的属性,以便Typescript识别赋值。

例如,

class Foo {
    constructor(obj: object) {
        for (const key in obj) {
            this[key] = obj[key]
        }
    }
}

const bar = new Foo({
    x: 1,
    y: 2,
});

bar.x; // Property 'x' does not exist on type 'Foo'

我正在尝试做什么:

class State {
    private state: string;

    constructor (states: string[]) {
        states.forEach((x) => {
            this[x] = () => this.state = x;
        });
    }
}

const x = new State(['open', 'closed']);

x.open(); // Property 'open' does not exist on type 'State'.

1 个答案:

答案 0 :(得分:1)

嗯,我不认为TypeScript有一种很好的方法可以让静态类扩展泛型类型。我的意思是,以下无效的 TypeScript是您要求的:

dd/mm/yyyy

所以你想要喜欢 mixin class,你可以将// doesn't work class Foo<T> extends T { constructor(obj: T) { for (const key in obj) { this[key] = obj[key]; } } } 扩展为FooFoo的构造函数...但不完全一样。这是我能做的最好的事情:

创建一个名称不同的类T,该类添加了所有_Foo特定的方法和属性。请注意,您必须声明Foothis类型才能为其分配T的属性:

T

然后,您可以将类型class _Foo<T> { constructor(obj: T) { for (const key in obj) { // assert this to be compatible with T (this as any as T)[key] = obj[key]; } } // Foo-specific properties and methods go here } 定义为Foo<T>_Foo<T>,并声明T也是一个对象,它充当{{1}的构造函数}}:

Foo

现在使用它:

Foo<T>

这对你有用吗?值得一提的是,这里涉及的困难可能表明,您尝试做的事情可能会通过另一种设计在TypeScript中实现。例如,type Foo<T> = T & _Foo<T>; const Foo = _Foo as { new <T>(obj: T): Foo<T> }; 可能拥有一个const bar = new Foo({ x: 1, y: 2, }); bar.x; // okay ,而不是 一个。然后你可以更直接的方式做到这一点。但这取决于你。

希望它有所帮助;祝你好运!