TypeScript:如何在构造函数中设置对象属性(取决于对象属性)

时间:2016-08-07 09:53:55

标签: javascript typescript ecmascript-6

  1. 如果构造函数中的项有属性计数器(item.counter),我需要在构造函数元素(this.counter)中创建此属性。仅当此属性具有项目时才能创建此属性?
  2. 接下来的问题,如何按条件在构造函数中创建新属性(例如,如果item.is_owner = true,我需要创建this.owner =“Owner”)
  3. export class Item {
        public counter: number;
        public is_owner: boolean;
        public owner: string;
        
        
        constructor(item) {
            this.counter = item.counter; // if item has counter, i need create this.counter
            this.owner = "Owner"; // if item.is_owner == true ???
        }
    }
    
    var element = new  Item (item);

1 个答案:

答案 0 :(得分:1)

很难理解你在代码中尝试做什么,例如ctor得到的item是什么?它是Item或另一种类型的另一个实例吗? 此外,与所有者的整个事情并不清楚。

在任何情况下,您的班级要么具有已定义的属性,要么具有已定义的属性 您当然可以在ctor中添加更多属性而不将它们定义为成员,但这会导致您可能希望避免的打字稿编译错误,例如:

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`
    }
}

您可以通过转换为any来解决这个问题:

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`

这里你可以使用anyconsole.log((p as any).y);然后你绕过编译器类型检查,如果你这样做,那么为什么还要打扰打字稿?

如果您想避免让nullundefined成员拥有相同接口/基类的不同实现并使用工厂函数创建正确的实现,您可以做些什么收到的数据,如:

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;
    }
}