I spent a bunch of time thinking about this over the course of two long walks, and I think I've come to understand pokémon better:
First of all, most people in the pokémon universe, including the player, the player character, and most NPCs you meet, operate on, like, at best middle school pokémonology. They are as familiar with pokémon as we as players are, through a model of reality very similar to the ludic layer. They know the types we know, moves, that kind of stuff.
Then you have the underlying reality of pokémon, which is almost certainly way messier than that. For "the Normal issue" in particular, my belief is that Normal is, in most important ways, "real", but it exists on a spectrum between Normal and Dark. They're pretty similar types in matchups, there's a lot of overlap in movesets, multiple species have convergences (Meowth line ~= Purrloin line, Sentret line ~= Poochyena line) or regional variations (Meowth ~= Alolan Meowth, Zigzagoon ~= Galarian Zigzagoon, Rattata ~= Alolan Rattata) that straddle the barrier, and they are both weak to fighting and immune to ghost, their defining matchup traits.
In general, types aren't "real", but they're a useful abstraction, although you obviously have to have researchers looking into what the heck is up with Freeze Dry, for example, or what the hell "Scrappy" actually is, and how it interacts with, for example, Odor Sleuth.