The global $post
object represents the current post within The Loop and is created by the the_post()
function. It enables functions like the_title()
, the_content()
etc. to show the title and content for the current post without needing to pass IDs or anything.
This is why a post type archive doesn’t have a $post
object set when you’re enqueuing scripts. Why would it? What post would it represent? What would $post->post_author
be for a post type archive? It doesn’t make sense to have one because an archive is not a post.
The correct solution is the one you found: The is_post_type_archive()
function. Under the hood it checks the main Query to see if it is for the archive for a post type.