我怎样才能做到这一点:
export class Base
{
constructor(public defaultValues: Partial<Base>)
{
if (defaultValues)
for (const [key, value] of Object.entries(defaultValues))
this[key] = value;
}
}
export class Extended extends Base
{
public prop1: boolean;
public method1()
{
//prop1 does not exists, because defaultValues are Base not Extended
this.defaultValues.prop1; //!!!! ERROR Property 'prop1' does not exists on type 'Partial<Base>'.
}
}
我需要为类本身设置一些默认值并将其存储在变量中,以便稍后我可以访问defaultValues。
编辑:
我也试试:
class Base<T extends Base = any> {
constructor(public defaultValues: Partial<T>) {
}
}
class Extended extends Base<Extended> {
public prop1: boolean;
public method1() {
this.defaultValues.prop1;
}
}
但得到了错误:
这个,但现在我得到错误
[keyof t]无法访问T [keyof T]
export class Base<T extends Base<T>>
{
constructor(public defaultValues: T)
{
if (defaultValues)
for (const [key, value] of Object.entries(defaultValues))
this[key] = value; //!!!!! ERROR
}
}
export class Extended extends Base<Extended>
{
public prop1: boolean;
public method1()
{
this.defaultValues.prop1;
}
}
已编辑3:
安装VS 15.3 (VS 2017 update 2)和Typescript SDK 2.3之后,在智能感知VS 2017中选择了Typescript 2.3后,我取得了一些进展。
只有一个小问题:
答案 0 :(得分:1)
Base
没有名为prop1
的成员,Extended
会这样做
您可以Base
通用:
class Base<T extends Base = any> {
constructor(public defaultValues: Partial<T>) {
...
}
}
class Extended extends Base<Extended> {
public prop1: boolean;
public method1() {
this.defaultValues.prop1;
}
}
在打字稿2.3之前(因为Generic parameter defaults)你需要这样做:
class Base<T extends Base<any>> {
constructor(public defaultValues: Partial<T>) {
}
}
如果您使用noImplicitAny
标志,则需要执行此操作:
class Base<T extends Base<any>> {
constructor(public defaultValues: T) {
if (defaultValues) {
for (const [key, value] of Object.entries(defaultValues)) {
this[key as keyof this] = value;
}
}
}
}
差异为this[key as keyof this] = value;