如何在TypeScript中为类属性动态赋值

Mak*_*kla 6 typescript

我想在TypeScript中动态地为MyClass分配多个属性,因此不需要编写多行代码来设置类属性.我写了以下代码:

interface IMy
{
    visible?: boolean;
    text?: string;
}

class MyClass
{
    element: JQuery;

    assing(o: IMy): void
    {
        for (let [key, value] of Object.entries(o))
        {
            if (typeof value !== "undefined")
                this[key] = value;
        }
    }

    get visible(): boolean
    {
        return this.element.is(":visible");
    }

    set visible(visible: boolean)
    {
        this.element.css("display", visible ? "" : "none");
    }

    get text(): string
    {
        return this.element.html();
    }

    set text(text: string)
    {
        this.element.html(text);
    }
}

let t = new MyClass();
t.assign({ visible: true });
//instead t.visible = true;

//or

t.assign({ text: "Something" });
//instead t.text = "something";

//or

t.assign({ text: "Something", visible: false });
//instead t.visible = true; 
//        t.text = "something";
Run Code Online (Sandbox Code Playgroud)

但是,我有问题符合this[key] = value;错误:

对象类型的索引签名隐式具有"任何"类型.

我需要改变什么,或者我的方法是完全错误的?
当接口是构造函数参数时,它也是在构造函数中设置默认属性的好方法.

编辑:
关于条目我真的很喜欢他们所以我使用这个代码:

//extensions.d.ts
interface Object
{
    entries<T>(o: any): [string, T][];
    entries(o: any): [string, any][];
}
//exntesion.js !!note js not ts
if (!Object.entries)
{
    Object.entries = function* entries(obj)
    {
        for (let key of Object.keys(obj))
        {
            yield [key, obj[key]];
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

主要思想是解决重载构造函数的问题,您只能设置所需的属性.
如果其他人发现它可用,这是完整的代码.

interface IMy
{
    prop1?: boolean;
    prop2?: string;
    prop3?: string;
    prop4?: number;
}

class MyClass implements IMy
{
    prop1: boolean = false;
    prop2: string = "";
    prop3: string = "Something";
    prop4: number = 0;

    constructor(properties: IMy)
    {
        this.assing(properties);
    }

    assing(o: IMy): void
    {
        let that = (<any>this);
        for (let key in o)
        {
            if (o.hasOwnProperty(key))
            {
                let value = (<any>o)[key];
                if (typeof value !== "undefined" && typeof that[key] !== "undefined")
                    that[key] = value;
            }
        }
    }

}

let my1 = new MyClass({ prop1: true });
let my2 = new MyClass({ prop2: "SomeText", prop3: "Anything" });
//I set prop2 and prop3
let my3 = new MyClass({ prop4: 10 });    
//I set prop4 (fourth parameter)

console.log(my1, my2, my3);
Run Code Online (Sandbox Code Playgroud)

Ron*_*īts 6

错误本身来自--noImplicitAny编译器选项.如果你删除它,错误就会消失.但我相信,这并不是一件坏事.

你需要以某种方式添加一个类型注释key,这似乎for .. of循环中没有问题.

我认为这种方法并不错,但是您需要稍微改写迭代属性.

顺便说一句,我假设你也是针对ES6(编译器不要抱怨.entries(),看起来像ES6的功能.它看起来像是数组,而不是对象.

编辑:

受到另一个SO答案的启发- 为了让错误消失,你可以添加一个强制转换any,如下所示:

(<any>this)[key] = value;
Run Code Online (Sandbox Code Playgroud)

但是,上述关于使用.entries()仍然适用.