Gli esordi al Fatima e il Parma con i prestiti in Serie B
Debutta tra i professionisti con i portoghesi del Fátima nel 2010, dopo aver giocato nelle selezioni giovanili di club blasonati come lo Sporting Lisbona, il Valencia e il Benfica.
Nell'estate 2011 viene ingaggiato dal Parma, che poco dopo lo cede in prestito al Gubbio, con cui debutta in Serie B il 10 settembre successivo, nella sconfitta per 1-3 contro la Reggina. Segna il suo primo gol con la maglia rossoblu proprio nella sfida di ritorno contro i calabresi, e conclude la stagione con 31 presenze e 2 reti.
Dopo aver fatto ritorno in Emilia, il 28 giugno 2012 viene ceduto in prestito allo Spezia, squadra neopromossa in Serie B.[3]
L'affermazione all'Empoli
Nell'estate 2013 l'Empoli lo acquista con la formula della compartecipazione.[4] L'estate successiva, alla risoluzione della compartecipazione, il Parma non si presenta alle buste, consentendo l'acquisto dell'intero cartellino del calciatore da parte della squadra toscana.[5]
Fa il suo esordio in Serie A il 31 agosto 2014, nella gara esterna contro l'Udinese, subentrando al posto di Elseid Hysaj al 21' del secondo tempo.[6]
Complessivamente con la maglia dell'Empoli colleziona 101 presenze in tre stagioni.
Il trasferimento alla Roma
L'8 luglio 2016 si trasferisce alla Roma con la formula del prestito oneroso da 3 milioni di euro più 1,5 di bonus e l'obbligo di riscatto al termine della stagione da 6 milioni.[7] Il 30 luglio seguente, durante un allenamento a Boston, si lesiona il legamento crociato anteriore del ginocchio sinistro. Esordisce in maglia giallorossa il 19 gennaio 2017, nel match degli ottavi di Coppa Italia vinto per 4-0 contro la Sampdoria. Nonostante a fine stagione raccolga soltanto 9 presenze complessive, sia a causa dell'infortunio che per l'ottimo rendimento del collega di reparto Emerson Palmieri, viene comunque riscattato dalla società giallorossa.[8]
Napoli
Il successivo 13 luglio si trasferisce al Napoli in prestito con obbligo di riscatto,[9] ritrovando così Maurizio Sarri, già suo allenatore ai tempi dell'Empoli.[10] Esordisce in maglia azzurra il 1º ottobre seguente, nella vittoria per 3-0 sul Cagliari, subentrando all'85' a Faouzi Ghoulam. Fa il suo esordio in Champions League il 21 novembre, alla quinta giornata della fase a gironi, subentrando a Piotr Zieliński e contribuendo alla vittoria per 3-0 del Napoli sugli ucraini dello Šachtar.[11][12] Segna il suo primo gol in Serie A il 10 febbraio 2018, nella vittoria per 4-1 contro la Lazio.[13] Si ripete il 26 dello stesso mese, segnando su punizione il gol del definitivo 5-0 al 91º minuto in casa del Cagliari.[14][15] A fine stagione viene riscattato dal club campano.[16]
Rimane con gli azzurri anche nelle stagioni successive, nonostante la partenza di Sarri e svariati avvicendamenti in panchina, che vedono approdare alla guida della squadra Carlo Ancelotti, Gennaro Gattuso (con il quale, al netto della vittoria di una Coppa Italia, nascono alcune tensioni)[17][18] e infine Luciano Spalletti, già suo allenatore ai tempi della Roma. Il 4 maggio 2023, in virtù del pareggio per 1-1 del Napoli contro l'Udinese, si aggiudica il primo scudetto della sua carriera, distinguendosi per l'alto numero di assist vincenti nel corso della stagione.[19][20][21]
Nell'estate del 2024, con l’arrivo di Antonio Conte in panchina, viene estromesso dal progetto tecnico e relegato fuori rosa, venendo escluso dalla lista dei giocatori utilizzabili in campionato.[22][23]
Il 19 agosto 2017 viene convocato per la prima volta in nazionale maggiore in vista delle gare di qualificazione al Mondiale 2018 contro Fær Øer e Ungheria, in programma rispettivamente il 31 agosto e il 3 settembre.[24] Debutta, però, il 26 marzo 2018, nell'amichevole persa per 3-0 contro i Paesi Bassi.[25] Grazie alle sue ottime prestazioni con il Napoli viene poi incluso nella lista dei 23 convocati per il Mondiale in Russia.[26][27]
Nel giugno del 2019 rientra tra i convocati per la fase finale della Nations League 2018-2019,[28] conclusasi con il successo in finale dei lusitani ai danni dell'Olanda (1-0).[29]
Nell'ottobre del 2022 viene inserito dal CTFernando Santos tra i pre-convocati per i Mondiali in Qatar,[30] salvo essere poi escluso dalla lista definitiva.[31]