我想在Angular应用中显示一台洗衣机。为此,我创建了一个Machine
模型:
import { User } from './user.model';
export class Machine {
id: number;
type: string;
pricing: string;
enableDurationSelection: boolean;
maxDuration: number;
costPerCycle: number;
elapsedTime?: number = 0;
user?: User;
}
和机器用户:
export class User {
id: number;
firstName?: string;
lastName: string;
balance: number;
getUsername(): string {
let username = '';
if (this.firstName) {
username += this.firstName[0] + '. ';
}
username += this.lastName.toUpperCase();
return username;
}
}
如何为User
模型执行鸭子输入?的getUsername()
属性似乎破坏了它。
我想在机器上添加一个计时器,以显示周期。我可以将startTimer()
和stopTimer()
属性添加到我的Machine
模型,但还需要其他属性,例如Observer
与机器数据无关,也将破坏鸭子的输入。
处理这种情况的推荐方法是什么?
似乎您想使用对象符号创建对象实例将所有字段,并且您认为应该以某种方式将方法添加到创建的对象中。
最接近的替代方法是向该类添加一个构造函数,该构造函数接受一个包含字段初始值的对象:
interface MachineOptions {
id : number;
type: string;
...
}
export class WashingMachine {
// field declarations here
public constructor(options: MachineOptions) {
// copy options to instance's fields here
}
}
const machine = new WashingMachine({
id: 1,
type: 'm-type1',
...
})
我还建议在此处避免将类作为接口实现(例如class WashingMachine : IMachineOptions
),以便您可以隐藏实现详细信息(内部字段语义可能与选项不同。