这种简化模式有哪些(不错,可读,可伸缩,高性能)的替代方案?
type Shape =
{ kind: "square", a: number } |
{ kind: "rect", a: number, b: number } |
{ kind: "circle", r: number }
let area = {
"square": function (s) { return s.a * s.a; },
"rect": function (s) { return s.a * s.b; },
"circle": function (s) { return s.r * s.r * Math.PI; },
calc(s: Shape) {
return area[s.kind](s);
}
}
area.calc({ kind: "square", a: 2 });
更新:
看起来形状触发了人们“向OOP”这个问题。在我眼中,使用OOP机制进行简单的功能选择是过大的。这是另一个例子
var printEntity = function (s) {
return {
"named": function (s) { return "&" + s.id + ";"; },
"decimal": function (s) { return "&#" + s.id + ";"; },
"hex": function (s) { return "&#x" + s.id + ";"; }
}[s.kind](s);
};
printEntity({ kind: "named", id: "ndash" });
最佳答案
一个简单的switch
语句或if-else
级联就可以解决问题。
优点:TypeScript exhaustive checks工作。
令人惊讶的是:这并不比地图模式慢。已在Chrome 62中用http://jsben.ch/3SRWx测试。
type Shape =
{ kind: "square", a: number } |
{ kind: "rect", a: number, b: number } |
{ kind: "circle", r: number }
function area(s: Shape): number {
switch (s.kind) {
case "square": return s.a * s.a;
case "rect": return s.a * s.b;
case "circle": return s.r * s.r * Math.PI;
}
// gives error if not all possible cases were handled above
const _exhaustiveCheck: never = s;
return 0;
}
area({ kind: "square", a: 2 });
关于javascript - 函数的查找对象有哪些替代方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47398048/