Angular 4.3.3 HttpClient: Como obter valor do cabeçalho de uma resposta?

(Editor: Código VS; Texto datilografado: 2.2.1)

O objetivo é obter os cabeçalhos da resposta da solicitação

Suponha uma solicitação POST com HttpClient em um serviço

import {
    Injectable
} from "@angular/core";

import {
    HttpClient,
    HttpHeaders,
} from "@angular/common/http";

@Injectable()
export class MyHttpClientService {
    const url = 'url';

    const body = {
        body: 'the body'
    };

    const headers = 'headers made with HttpHeaders';

    const options = {
        headers: headers,
        observe: "response", // to display the full response
        responseType: "json"
    };

    return this.http.post(sessionUrl, body, options)
        .subscribe(response => {
            console.log(response);
            return response;
        }, err => {
            throw err;
        });
}

Documentação angular HttpClient

O primeiro problema é que eu tenho um erro de texto datilografado:

'Argument of type '{ 
    headers: HttpHeaders; 
    observe: string; 
    responseType: string;
}' is not assignable to parameter of type'{ 
    headers?: HttpHeaders;
    observe?: "body";
    params?: HttpParams; reportProgress?: boolean;
    respons...'.

Types of property 'observe' are incompatible.
Type 'string' is not assignable to type '"body"'.'
at: '51,49' source: 'ts'

De fato, quando vou para o método ref of post (), aponto para este protótipo (eu uso o código VS)

post(url: string, body: any | null, options: {
        headers?: HttpHeaders;
        observe?: 'body';
        params?: HttpParams;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<ArrayBuffer>;

Mas eu quero esse método sobrecarregado:

post(url: string, body: any | null, options: {
    headers?: HttpHeaders;
    observe: 'response';
    params?: HttpParams;
    reportProgress?: boolean;
    responseType?: 'json';
    withCredentials?: boolean;
}): Observable<HttpResponse<Object>>;

Então, tentei corrigir esse erro com esta estrutura:

  const options = {
            headers: headers,
            "observe?": "response",
            "responseType?": "json",
        };

E compila! Mas eu apenas recebo a solicitação do corpo como no formato json.

Além disso, por que eu tenho que colocar um? símbolo no final de algum nome de campos? Como eu vi no site do Typecript, esse símbolo deve apenas dizer ao usuário que é opcional?

Eu também tentei usar todos os campos, sem e com? marcas

EDITAR

Eu tentei as soluções propostas porAngular 4 obtém cabeçalhos da resposta da API. Para a solução do mapa:

this.http.post(url).map(resp => console.log(resp));

O compilador de texto datilografado informa que o mapa não existe porque não faz parte do Observable

Eu também tentei isso

import { Response } from "@angular/http";

this.http.post(url).post((resp: Response) => resp)

Ele é compilado, mas recebo uma resposta não suportada do tipo de mídia. Essas soluções devem funcionar para "Http", mas não no "HttpClient".

EDIT 2

Também recebo um tipo de mídia não suportado com a solução @Supamiu, por isso seria um erro nos meus cabeçalhos. Portanto, a segunda solução acima (com tipo de resposta) também deve funcionar. Mas, pessoalmente, não acho que seja uma boa maneira de misturar "Http" com "HttpClient", para manter a solução do Supamiu

questionAnswers(4)

yourAnswerToTheQuestion