Well, I can't see where this is documented, but this structure seems to have worked for me (calling pagination() on my CPT collection):
$args = array(
'post_type' => 'my_custom_post_type',
'posts_per_page' => 5,
'paged' => $paged
);
$myCollection = new Timber\PostQuery($args);
$context['collection'] = $myCollection;
$context['pagination'] = $myCollection->pagination();
Then I have to set up Routes::map for the pagination to actually work. Here's an example:
function add_routes() {
Routes::map(':name/page/:pg', function($params){
$query = 'posts_per_page=1&post_type=page&paged='.$params['pg'];
Routes::load('template-'.$params['name'].'.php', $params, $query);
});
}
I'm calling this function from the root of my functions.php (i.e., not using any hook).
I should note that this also allows me to still get the page in my context -- on every paginated page -- using $post = new Timber\Post(). The key there seems to be setting up the route with posts_per_page=1 and post_type=page. Originally, I was confusing myself by setting up the route mapping the same as my query $args for paginated CPTs in my template.