Override wp_delete_post and move to trash instead for custom post type

Inside wp_delete_post() there is the following code,

/**
 * Filters whether a post deletion should take place.
 *
 * @since 4.4.0
 *
 * @param bool|null $delete       Whether to go forward with deletion.
 * @param WP_Post   $post         Post object.
 * @param bool      $force_delete Whether to bypass the trash.
 */
$check = apply_filters( 'pre_delete_post', null, $post, $force_delete );
if ( null !== $check ) {
    return $check;
}

So I think with the following filtering you might be able to prevent the deletion.

function prevent_cpt_delete( $delete, $post, $force_delete ) {
  // Is it my post type someone is trying to delete?
  if ( 'my_post_type' === $post->post_type && ! $force_delete ) {
    // Try to trash the cpt instead
    return wp_trash_post( $post->ID ); // returns (WP_Post|false|null) Post data on success, false or null on failure.
  }
  return $delete;  
}
add_filter('pre_delete_post', 'prevent_cpt_delete', 10, 3);