המתודה Operate
איננה מקבלת כל אינדיקציה על טיב הפעולה שהיא אמורה לבצע, ניתן להסיק את אחת משתי האפשרויות:
- שהיא תבדוק בעצמה (Runtime type checking) לפי מספר הפרמטרים שסופקו
- טיב הפעולה אינו רלוונטי עבורה
כדי לשפר את הType-Safety עבור הקוד שיעשה שימוש במתודה, ניתן לעשות שימוש בFunction Overloading:
class Instructions {
public static operate(callback: UnaryOperation, dst: number)
public static operate(callback: BinaryOperation, dst: number, src: number)
public static operate(callback: SignBinaryOperation, dst: number, src: number, powerEvaluation: number)
public static operate(callback: Function, dst: number, src?: number, powerEvaluation?: number) {
// Note: You'll have to do type checking manually
// here if you want differing behavior based on the required operation type
}
}
שימוש:
operate((x) => { }, 1) // Works. Operation: Unary
operate((x, y, z) => { }, 1, 2) // Fails (x, y, z) => void' is not assignable to parameter of type 'BinaryOperation
operate((x, y, z) => { }, 1, 2, 3) // Works. Operation: SignBinary
נ.ב. שימוש בUnion Types לא יפתור את הבעיה, משום שהסוג המדויק של OperationType
לעולם לא יהיה ידוע בתוך המתודה בזמן כתיבת הקוד.