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);
答案 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`
这里你可以使用any
:console.log((p as any).y);
然后你绕过编译器类型检查,如果你这样做,那么为什么还要打扰打字稿?
如果您想避免让null
或undefined
成员拥有相同接口/基类的不同实现并使用工厂函数创建正确的实现,您可以做些什么收到的数据,如:
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;
}
}