在 Typescript 中使用 If-instanceof-statements 不好吗?
Is it bad to have If-instanceof-statements in Typescript?
selectAction: (actionEvent) => {
if (actionEvent instanceof Action1) {
// action1 body implementation
} else if (actionEvent instanceof Action2) {
// action2 body implementation
}
}
上面的代码片段反映了不同类型的动作functionalities.I使用了if和else条件来检查动作。
我觉得这不是一个好的解决方案,因为我以后可能会有更多的操作,而且我的 if-else-ladder 会不断增长,当有变化时我需要再次更新我的代码。
有什么改进这个特定场景的想法吗?
在 TypeScript 中使用 if
/else
本质上没有错。
但是,当您使用 instanceof
时,很可能您有更好的选择。在这种情况下,几乎可以肯定,动作本身应该对它们所做的事情负责:
selectAction: (actionEvent) => {
actionEvent.execute();
}
...或
selectAction: (actionEvent) => {
const action = /*...derive action from actionEvent...*/;
action.execute();
}
...或类似的(或者当然,直接使用 actionEvent.execute()
而不是 selectAction
)。
这是基本的多态性,不同的对象符合相同的接口,并且在被调用时(可能)做不同的事情。
使用鸭子输入 的方法来避免有条件的情况。 Source
在每个类型实例 Action1
和 Action2
中有一个名为 selection()
的方法,并使用它来定义要构建的 body/desired 功能。并简单地调用 selection()
方法避免条件。所以基于类型的实例它会调用对应类型
的正确selection()
方法
selectAction: (actionEvent) => {
if (actionEvent instanceof Action1) {
// action1 body implementation
} else if (actionEvent instanceof Action2) {
// action2 body implementation
}
}
上面的代码片段反映了不同类型的动作functionalities.I使用了if和else条件来检查动作。
我觉得这不是一个好的解决方案,因为我以后可能会有更多的操作,而且我的 if-else-ladder 会不断增长,当有变化时我需要再次更新我的代码。
有什么改进这个特定场景的想法吗?
在 TypeScript 中使用 if
/else
本质上没有错。
但是,当您使用 instanceof
时,很可能您有更好的选择。在这种情况下,几乎可以肯定,动作本身应该对它们所做的事情负责:
selectAction: (actionEvent) => {
actionEvent.execute();
}
...或
selectAction: (actionEvent) => {
const action = /*...derive action from actionEvent...*/;
action.execute();
}
...或类似的(或者当然,直接使用 actionEvent.execute()
而不是 selectAction
)。
这是基本的多态性,不同的对象符合相同的接口,并且在被调用时(可能)做不同的事情。
使用鸭子输入 的方法来避免有条件的情况。 Source
在每个类型实例 Action1
和 Action2
中有一个名为 selection()
的方法,并使用它来定义要构建的 body/desired 功能。并简单地调用 selection()
方法避免条件。所以基于类型的实例它会调用对应类型
selection()
方法