Javascript TypeScript:如何在构造函数中设置对象属性(取决于对象属性) 若构造函数中的项具有属性计数器(item.counter),我需要在构造函数元素(this.counter)中创建此属性。仅当此属性包含项时,如何创建此属性 下一个问题是,如何根据条件在构造函数中创建新属性(例如,如果item.is_owner=true,我需要创建this.owner=“owner”)

Javascript TypeScript:如何在构造函数中设置对象属性(取决于对象属性) 若构造函数中的项具有属性计数器(item.counter),我需要在构造函数元素(this.counter)中创建此属性。仅当此属性包含项时,如何创建此属性 下一个问题是,如何根据条件在构造函数中创建新属性(例如,如果item.is_owner=true,我需要创建this.owner=“owner”),javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,导出类项目{ 公众柜台:号码; public是_所有者:布尔值; 公共所有者:字符串; 建造师(项目){ this.counter=item.counter;//如果item有计数器,我需要创建这个.counter this.owner=“owner”;//如果item.is\u owner==true??? } } var元素=新项目(项目)很难理解您试图从代码中执行的操作,例如,ctor作为参数获取的项是什么?它是项的另一个实例还是另一种类型? 还有,关于主人的事情还不清楚 在任何情况下,您

导出类项目{
公众柜台:号码;
public是_所有者:布尔值;
公共所有者:字符串;
建造师(项目){
this.counter=item.counter;//如果item有计数器,我需要创建这个.counter
this.owner=“owner”;//如果item.is\u owner==true???
}
}

var元素=新项目(项目)很难理解您试图从代码中执行的操作,例如,ctor作为参数获取的
项是什么?它是
项的另一个实例还是另一种类型?
还有,关于主人的事情还不清楚

在任何情况下,您的类要么有定义的属性,要么没有定义的属性。
当然,您可以在ctor中添加更多属性,而无需将它们定义为成员,但这将导致您可能希望避免的typescript编译错误,例如:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y; // error: Property `y` does not exists on type `Point`
    }
}
您可以通过强制转换到
任意
来解决此问题:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        (this as any).y = y; // no error
    }
}
但这是一个问题:

let p = new Point(10, 5);
console.log(p.x);
console.log(p.y); // error: Property `y` does not exists on type `Point`
在这里,您可以使用
any
console.log((p as any).y)
但是你绕过了编译器类型检查,如果你这么做了,为什么还要麻烦使用typescript呢

如果希望避免成员具有
null
未定义的
值,可以做的是,对同一接口/基类使用不同的实现,并使用工厂函数根据接收到的数据创建正确的实现,例如:

interface ItemData {
    counter?: number;
}

class BaseItem {
    static create(data: ItemData): BaseItem {
        if (data.counter) {
            return new ItemWithCounter(data);
        }

        return new BaseItem(data);
    }

    constructor(data: ItemData) {}
}

class ItemWithCounter extends BaseItem {
    private counter: number;

    constructor(data: ItemData) {
        super(data);
        this.counter = data.counter;
    }
}

很难理解您试图从代码中执行的操作,例如,ctor作为参数获取的
项是什么?它是
项的另一个实例还是另一种类型?
还有,关于主人的事情还不清楚

在任何情况下,您的类要么有定义的属性,要么没有定义的属性。
当然,您可以在ctor中添加更多属性,而无需将它们定义为成员,但这将导致您可能希望避免的typescript编译错误,例如:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y; // error: Property `y` does not exists on type `Point`
    }
}
您可以通过强制转换到
任意
来解决此问题:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        (this as any).y = y; // no error
    }
}
但这是一个问题:

let p = new Point(10, 5);
console.log(p.x);
console.log(p.y); // error: Property `y` does not exists on type `Point`
在这里,您可以使用
any
console.log((p as any).y)
但是你绕过了编译器类型检查,如果你这么做了,为什么还要麻烦使用typescript呢

如果希望避免成员具有
null
未定义的
值,可以做的是,对同一接口/基类使用不同的实现,并使用工厂函数根据接收到的数据创建正确的实现,例如:

interface ItemData {
    counter?: number;
}

class BaseItem {
    static create(data: ItemData): BaseItem {
        if (data.counter) {
            return new ItemWithCounter(data);
        }

        return new BaseItem(data);
    }

    constructor(data: ItemData) {}
}

class ItemWithCounter extends BaseItem {
    private counter: number;

    constructor(data: ItemData) {
        super(data);
        this.counter = data.counter;
    }
}

我不确定您所说的
“仅当此属性有项时创建此属性”是什么意思,如果
项没有
计数器会发生什么情况?您不能在
项中没有
计数器
成员,它要么在那里,要么不在那里。但是您可以让它的值
null
未定义
。这就是你要找的吗?好的,谢谢。当然,我可以写这个.counter=item.counter | null,但是我想只有当item.counter存在时,我想有任何方法来创建这个计数器。“如果项目没有计数器,会发生什么情况?”element.counter也不会有这个属性:)我不确定只有当这个属性有项“
”时,才创建这个属性,如果
没有
计数器
,会发生什么情况?您不能在
项中没有
计数器
成员,它要么在那里,要么不在那里。但是您可以让它的值
null
未定义
。这就是你要找的吗?好的,谢谢。是的,当然,我可以写这个.counter=item.counter | | null,但我认为只有在item.counter存在时才可以创建这个.counter。“如果item没有counter怎么办?”element.counter也不会有这个属性:)好的,谢谢。“还有,关于所有者的整个事情还不清楚。”我只需要在其他类型的基础上再创建一个元素类型。因此,如果item.is_owner==true,element.owner应该看起来像element.owner==“owner”,这很简单:
this.owner=item.is_owner?“所有者”:“非所有者”如果没有item.is_owner或item.is_owner==false,我不需要element.owner属性;我只是想避免像:element.owner=='null'或'undefined'或''这样的附加字段,所以请使用我在示例中给出的示例,其中存在共享同一接口/类的不同实现。同样,您可以有成员或没有成员,但这不是您在运行时决定的,而是静态的。好的,谢谢。”另外,所有者的整个情况并不清楚。“我只需要在其他类型的基础上再创建一个元素类型。因此,如果item.is\u owner==true,element.owner应该看起来像element.owner==“owner”,这很简单:
this.owner=item.is\u owner?“owner”:“NotOwner”";如果没有item.is_owner或item.is_owner==false,我不需要element.owner属性;我只是想避免像:element.owner==“null”或“undefined”或“”这样的附加字段,所以请使用我在示例中给出的示例,其中存在共享同一接口/类的不同实现。同样,您可以有成员,也可以没有成员,但这不是您在运行时决定的,而是静态的。