【发布时间】:2020-09-14 14:58:38
【问题描述】:
我已尝试找到解决方案,但我似乎无法找出如何在泛型中防止对象被包含在基于属性值的数组中。
我在一次在线面试中得到了以下练习,我应该在一个小时内开发以下内容:
一个动物园,里面有五只动物和两只鸟,两个动物园管理员过夜,四个动物园管理员早上。只有诺曼人可以进入虎笼
我开始研究它,但卡在 index.ts 中,我可以在其中执行以下操作: Lion.assignHandler(约翰); 但我希望打字稿阻止我将约翰添加到狮子,而不是让我。我只希望 norman 和其他在 lion's handlers 中的员工,并且只允许 _dangerHandler 属性为 true 的 handlers 员工。
沙盒位于以下位置:https://codesandbox.io/s/zoo-example-yi3op
export default interface Dangerous {
canBeHandledBy(employees: Employee[]): void;
}
import Employee from "./Employee";
export default class Animal {
private _handlers: Employee[] = [];
constructor(private _name: string){}
public get name() {
return this._name;
}
public get handlers(): Employee[] {
return this._handlers;
}
public set handlers(employees: Employee[]) {
this._handlers = employees;
}
public assignHandler(employee: Employee): void {
this._handlers.push(employee);
}
}
export default class Employee {
constructor(private _name: string, private _gender: Gender, private _employeeTitle: EmployeeTitle, private _dangerHandler: boolean = false) {}
public get name():string {
return this._name;
}
public get gender(): Gender {
return this._gender;
}
public get isDangerHandler(): boolean {
return this._dangerHandler;
}
public get title(): EmployeeTitle {
return this._employeeTitle;
}
public set title(title: EmployeeTitle){
this._employeeTitle = title;
}
}
export default class Lion extends Animal implements Dangerous {
constructor(_name: string) {
super(_name)
}
canBeHandledBy(employees: Employee[]): void {
try {
const ordinaryEmployees = employees.filter(emp => !emp.isDangerHandler);
if(ordinaryEmployees.length >0 ){
throw new Error('Ordinary meployees not allowed to handle Lion');
}
this.handlers = employees;
}
catch(e) {
console.log(e);
}
}
}
在 app.js 中
我希望 typescript 阻止我将 john 添加到 lion 而不是它让我。
const norman:Employee = new Employee("norman", Gender.MALE, EmployeeTitle.ZOOKEEPER, true);
const john:Employee = new Employee("john", Gender.MALE, EmployeeTitle.ZOOKEEPER);
const lion = new Lion("zumba");
lion.assignHandler(john)
【问题讨论】:
标签: typescript oop generics