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不允许你从类型中获取运行时值。
答案 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
答案 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功能请求/建议。这可能是追踪您想要的状态的最有效位置。