Typescript构造函数中的部分params和扩展类中的访问

时间:2017-06-03 16:21:07

标签: typescript

我怎样才能做到这一点:

export class Base
{
    constructor(public defaultValues: Partial<Base>)
    {
        if (defaultValues)
            for (const [key, value] of Object.entries(defaultValues))
                this[key] = value;
    }
}

export class Extended extends Base
{
    public prop1: boolean;

    public method1()
    {
        //prop1 does not exists, because defaultValues are Base not Extended
        this.defaultValues.prop1;     //!!!! ERROR Property 'prop1' does not exists on type 'Partial<Base>'.
    }
}

我需要为类本身设置一些默认值并将其存储在变量中,以便稍后我可以访问defaultValues。

编辑:
我也试试:

class Base<T extends Base = any> {
    constructor(public defaultValues: Partial<T>) {

    }
}

class Extended extends Base<Extended> {
    public prop1: boolean;

    public method1() {
        this.defaultValues.prop1;
    }
}

但得到了错误:

enter image description here

这个,但现在我得到错误

  

[keyof t]无法访问T [keyof T]

export class Base<T extends Base<T>>
{
    constructor(public defaultValues: T)
    {
        if (defaultValues)
            for (const [key, value] of Object.entries(defaultValues))
                this[key] = value;  //!!!!! ERROR
    }
}

export class Extended extends Base<Extended>
{
    public prop1: boolean;

    public method1()
    {        
        this.defaultValues.prop1; 
    }
}

默认参数出错:enter image description here

已编辑3:
安装VS 15.3 (VS 2017 update 2)和Typescript SDK 2.3之后,在智能感知VS 2017中选择了Typescript 2.3后,我取得了一些进展。 只有一个小问题:enter image description here

1 个答案:

答案 0 :(得分:1)

Base没有名为prop1的成员,Extended会这样做 您可以Base通用:

class Base<T extends Base = any> {
    constructor(public defaultValues: Partial<T>) {
        ...
    }
}

class Extended extends Base<Extended> {
    public prop1: boolean;

    public method1() {
        this.defaultValues.prop1;
    }
}

修改

在打字稿2.3之前(因为Generic parameter defaults)你需要这样做:

class Base<T extends Base<any>> {
    constructor(public defaultValues: Partial<T>) {

    }
}

第二次编辑

如果您使用noImplicitAny标志,则需要执行此操作:

class Base<T extends Base<any>> {
    constructor(public defaultValues: T) {
        if (defaultValues) {
            for (const [key, value] of Object.entries(defaultValues)) {
                this[key as keyof this] = value;
            }
        }
    }
}

差异为this[key as keyof this] = value;