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

eve*_*992 8 typescript

Typescript允许参数属性

class ParameterProperty {
  constructor(private member: number) {}
}
Run Code Online (Sandbox Code Playgroud)

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

但是,通过解构没有"命名参数"的等价物.

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

class Destructed {
  constructor({private prefix, private suffix}: DestructedOptions) {}
}
Run Code Online (Sandbox Code Playgroud)

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

class Destructed {
  private prefix: string
  private suffix: string
  constructor({prefix, suffix}: DestructedOptions) {
    this.prefix = prefix;
    this.suffix = suffix;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Nit*_*mer 9

关于什么:

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

    constructor(opts: DestructedOptions) {
        Object.assign(this, opts);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,还有一个悬而未决的问题:结合解构与参数属性


编辑

如果您想避免在类中重写属性,则需要将成员设为公开,如果是这种情况,则解决方案如我链接到的问题所示:

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
Run Code Online (Sandbox Code Playgroud)

操场上的代码


Bur*_*ris 5

在 ECMAScript 中,解构赋值会导致变量中的变量(不是属性而是属性)接收组件值。

自 2015 年 10 月以来,一直存在将解构与参数属性相结合的TypeScript 功能请求/建议。这可能是跟踪您想要的状态的最有效的地方。