For custom templates, is it better to use `template_include` or `type_template`?

{type}_template is a filter inside the get_query_template function. That function is called by a series of functions called get_home_template, get_category_template and so on. It allows you to very specifically target templates.

You can see it in action in template-loader.php, where the $tag_templates variable is defined, binding conditions like is_home, is_category and so on to the functions. Depending on the condition the function is then executed on the line where it says $template = call_user_func( $template_getter );.

A bit further on in the file you see the template_include filter. This is the last possibility to change the template before it is actually loaded. This means anything you may have done with {type}_template can be overruled here.

So, if you have full control over your install, the semantically most correct way would be to use {type}_template, because that filter is meant to keep track of template changes under specific circumstances. It would keep your code more readable.

However, if you want to make sure plugins are not overruling your {type}_template filter, you would opt for template_include.