Preheat and prep: Heat the oven to 350°F (175°C). Grease a 9x13-inch baking pan and line the bottom with parchment if you have it.
This helps the cake release cleanly.
Mix dry ingredients: In a large bowl, whisk flour, granulated sugar, brown sugar, baking powder, baking soda, salt, cinnamon, nutmeg, and ginger until no lumps remain.
Whisk wet ingredients: In another bowl, beat the eggs, oil, yogurt (or sour cream), and vanilla until smooth and slightly thick.
Combine: Pour the wet mixture into the dry and stir gently until just combined. Do not overmix. Fold in the grated carrots, crushed pineapple (well-drained), and nuts or coconut if using.
Bake: Spread the batter evenly in the pan.
Bake for 28–35 minutes, or until the center springs back and a toothpick comes out with a few moist crumbs. Rotate once if your oven has hot spots.
Cool slightly and poke: Let the cake cool in the pan on a rack for 15 minutes. Using a skewer or fork, poke holes all over the cake, spacing them about 1/2 inch apart.
Go all the way to the edges.
Make the tres leches mixture: In a measuring cup or bowl, whisk sweetened condensed milk, evaporated milk, whole milk, vanilla, and a pinch of cinnamon until smooth.
Soak the cake: Slowly pour the milk mixture evenly over the warm cake. Take your time so it absorbs instead of pooling. If some liquid gathers at the edges, nudge it toward drier areas with a spatula.
Chill: Cover and refrigerate for at least 4 hours, preferably overnight.
The texture improves as it rests.
Whip the topping: Beat heavy cream, powdered sugar, and vanilla to soft, fluffy peaks. Don’t overwhip; you want it cloud-like.
Finish and garnish: Spread the whipped cream over the chilled cake. Dust with cinnamon and sprinkle toasted nuts on top if you like.
Serve: Slice cold for clean edges.
Wipe the knife between cuts for neat pieces.