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不允许你从类型中获取运行时值.
关于什么:
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)
(操场上的代码)
在 ECMAScript 中,解构赋值会导致变量中的变量(不是属性而是属性)接收组件值。
自 2015 年 10 月以来,一直存在将解构与参数属性相结合的TypeScript 功能请求/建议。这可能是跟踪您想要的状态的最有效的地方。
| 归档时间: |
|
| 查看次数: |
4405 次 |
| 最近记录: |