|
|
|
|
|
by ts0000
1959 days ago
|
|
In addition to the other TypeScript examples, here's one that I would actually use. Now, it's not encoding the types not as positional, but named arguments via objects. Allows me to destructure them, for added clarity. type Circle = {x: number; y: number; r: number};
type Rectangle = {x: number; y: number; w: number; h: number};
type Shape = <T>(xs: {
circle: (args: Circle) => T;
rectangle: (args: Rectangle) => T;
}) => T;
function Circle(x: Circle): Shape {
return ({circle}) => circle(x);
}
function Rectangle(x: Rectangle): Shape {
return ({rectangle}) => rectangle(x);
}
const exampleCircle = Circle({x: 2, y: 1.4, r: 4.5});
const exampleRectangle = Rectangle({x: 1.3, y: 3.1, w: 10.3, h: 7.7});
const area = (shape: Shape): number =>
shape({
circle: ({r}: Circle) => Math.PI * r * r,
rectangle: ({w, h}: Rectangle) => w * h,
});
console.log(area(exampleCircle));
console.log(area(exampleRectangle));
/edit: Fixed formatting.
/edit: Clarify something. |
|
Also, you seem to have created functions and types with the same names (Circle and Rectangle) which seems dangerous.