构造函数中的析构参数属性

时间:2017-05-08 00:39:34

标签: typescript

Typescript允许参数属性

class ParameterProperty {
  constructor(private member: number) {}
}

上面创建了一个私有成员member的类,构造函数将this.member设置为构造函数的第一个参数。

但是,通过解构没有“命名参数”的等价物。

interface DestructedOptions {
  prefix: string;
  suffix: string;
}

class Destructed {
  constructor({private prefix, private suffix}: DestructedOptions) {}
}

以上不起作用,你必须做这样的事情:

class Destructed {
  private prefix: string
  private suffix: string
  constructor({prefix, suffix}: DestructedOptions) {
    this.prefix = prefix;
    this.suffix = suffix;
  }
}

这是非常详细的,在向DestructuredOptions添加新属性时需要更新三个地方。我尝试了类似的东西,使用映射属性

class Destructed {
  private [P in keyof DestructedOptions]: T[DestructedOptions];
  constructor(opts: DestructedOptions) {
    Object.assign(this, opts)
  }
}

仅发现映射属性只能用于Types,而不能用于接口或类。我不喜欢这个选项,因为它复制了opts中的所有内容,我真的想要这样的东西:

class Destructed {
  constructor(opts: DestructedOptions) {
    for (let key in keyof DestructedOptions) {
      this[key] = opts[key];
    }
  }
}

但是当然,typescript不允许你从类型中获取运行时值。

3 个答案:

答案 0 :(得分:2)

怎么样:

class Destructed {
    private prefix: string;
    private suffix: string;

    constructor(opts: DestructedOptions) {
        Object.assign(this, opts);
    }
}

此外,还有一个未解决的问题:Combining destructuring with parameter properties

修改

如果你想避免在课堂上重写属性,那么你需要公开成员,在这种情况下,解决方案就像我链接到的问题所示:

class Destructed {
    constructor(opts: DestructedOptions) {
        Object.assign(this, opts);
    }
}

interface Destructed extends DestructedOptions { }

let destructed = new Destructed({ prefix: "prefix", suffix: "suffix" });
console.log(destructed.prefix);
console.log(destructed.suffix);
console.log(destructed.DoesntExist); // error

code in playground

答案 1 :(得分:0)

没有明显的,直接的方式来做你想要的。考虑在班级中保留options而不是单个属性,如

interface DestructedOptions {
  prefix: string;
  suffix: string;
}

class Destructed {
  constructor(public options: DestructedOptions) {}
}

<!-- in template -->
Prefix is {{options.prefix}}!!

答案 2 :(得分:0)

在ECMAScript中,destructuring assignment导致接收组件值的变量(不是属性而不是属性)中的变量。

自2015年10月开始,combining destructuring with parameter properties已开启了TypeScript功能请求/建议。这可能是追踪您想要的状态的最有效位置。