Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 构造函数中的非结构化参数属性_Typescript - Fatal编程技术网

Typescript 构造函数中的非结构化参数属性

Typescript 构造函数中的非结构化参数属性,typescript,Typescript,Typescript允许参数属性 class ParameterProperty { constructor(private member: number) {} } class Destructed { private [P in keyof DestructedOptions]: T[DestructedOptions]; constructor(opts: DestructedOptions) { Object.assign(this, opts) } } 上面

Typescript允许参数属性

class ParameterProperty {
  constructor(private member: number) {}
}
class Destructed {
  private [P in keyof DestructedOptions]: T[DestructedOptions];
  constructor(opts: DestructedOptions) {
    Object.assign(this, opts)
  }
}
上面创建了一个具有私有成员
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;
  }
}
class Destructed {
  constructor(opts: DestructedOptions) {
    for (let key in keyof DestructedOptions) {
      this[key] = opts[key];
    }
  }
}
这非常冗长,在向
DestructuredOptions
添加新属性时,需要对三个位置进行更新。我尝试了类似的方法,使用映射属性

class ParameterProperty {
  constructor(private member: number) {}
}
class Destructed {
  private [P in keyof DestructedOptions]: T[DestructedOptions];
  constructor(opts: DestructedOptions) {
    Object.assign(this, opts)
  }
}
只是为了发现映射属性只能在类型中使用,而不能在接口或类中使用。无论如何,我不喜欢这个选项,因为它复制了opts中的所有内容,我真的想要这样的东西:

class Destructed {
  private prefix: string
  private suffix: string
  constructor({prefix, suffix}: DestructedOptions) {
    this.prefix = prefix;
    this.suffix = suffix;
  }
}
class Destructed {
  constructor(opts: DestructedOptions) {
    for (let key in keyof DestructedOptions) {
      this[key] = opts[key];
    }
  }
}
当然,typescript不允许您从类型中获取运行时值。

关于:

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

    constructor(opts: DestructedOptions) {
        Object.assign(this, opts);
    }
}
还有一个悬而未决的问题:


编辑 如果希望避免在类中重新写入属性,则需要将成员公开,在这种情况下,解决方案如我链接到的问题所示:

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
()

那么:

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

    constructor(opts: DestructedOptions) {
        Object.assign(this, opts);
    }
}
还有一个悬而未决的问题:


编辑 如果希望避免在类中重新写入属性,则需要将成员公开,在这种情况下,解决方案如我链接到的问题所示:

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

()

做你想做的事没有明显、直接的方法。考虑在类中持有<>代码>选项>代码,而不是单独的属性,如

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

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

<!-- in template -->
Prefix is {{options.prefix}}!!
接口析构函数选项{
前缀:字符串;
后缀:字符串;
}
类被破坏{
构造函数(公共选项:析构函数选项){}
}
前缀是{options.Prefix}}!!

做你想做的事没有明显、直接的方法。考虑在类中持有<>代码>选项>代码,而不是单独的属性,如

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

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

<!-- in template -->
Prefix is {{options.prefix}}!!
接口析构函数选项{
前缀:字符串;
后缀:字符串;
}
类被破坏{
构造函数(公共选项:析构函数选项){}
}
前缀是{options.Prefix}}!!
在ECMAScript中,在接收组件值的变量(不是属性,而是属性)中生成变量

自2015年10月以来,一直有一个关于open的TypeScript功能请求/建议。这可能是跟踪所需内容状态的最有效位置。

在ECMAScript中,变量中的变量(不是属性,而是属性)接收组件值


自2015年10月以来,一直有一个关于open的TypeScript功能请求/建议。这可能是跟踪所需内容状态的最有效的地方。

这并不能解决您的问题,但您还应该使用
implements
关键字来创建类析构函数和接口析构函数选项之间关系的显式抽象没有明显的、简单的,直接解决你的问题。如果你想声明一个属性,你必须声明它。经过几天的研究后,看看我的答案:它不能解决你的问题,但你还应该使用
implements
关键字来创建类析构函数和接口析构函数选项之间关系的显式抽象没有明显的,简单、直接地解决您的问题。如果你想申报财产,你必须申报。经过几天的研究,我的答案是链接:但他的全部观点是,他不想单独申报财产。@torazaburo是的,这是会员私有化的代价。但它确实省去了将每个值分配给成员的麻烦。@nitzan tomer,但其缺点是将所有内容从
选择
写入
。检查我的修订答案这意味着任何对
析构函数.prefix
的引用都将失败,他将不得不放弃类型检查并写入
析构函数[“prefix”]
,这不是一个很好的解决方案。但他的全部观点是,他希望避免单独声明属性。@torazaburo是的,这是让成员私有化的代价。但它确实省去了将每个值分配给成员的麻烦。@nitzan tomer,但其缺点是将所有内容从
选择
写入
。检查我的修订答案这意味着任何对
析构函数.prefix
的引用都将失败,他将不得不放弃类型检查并写入
析构函数[“prefix”]
,这不是一个很好的解决方案。