这种简化模式有哪些(不错,可读,可伸缩,高性能)的替代方案?

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/

10-11 17:46