Cresciuto nell'Aspire Academy, il 20 ottobre 2016, poche settimane dopo il suo diciottesimo compleanno, si trasferisce all'Eupen, venendo ufficialmente tesserato nel successivo mese di gennaio.[3]
Il 9 agosto 2018 si trasferisce al Barcellona, che mette su di lui una clausola da 100 milioni.[4][5]
Dopo avere giocato con la squadra B, il 13 aprile 2019 debutta, giocando da titolare, con la prima squadra in occasione dello 0-0 contro l'Huesca.[6]
Gioca 6 partite complessivamente con la prima squadra dei catalani prima di venire ceduto in prestito al Nizza il 31 gennaio 2020.[7][8]
Il 21 settembre seguente si trasferisce, sempre a titolo temporaneo, al PAOK.[9] Il 13 dicembre, durante il derby perso per 1-0 contro l'Arīs Salonicco, nel tentativo di salvare un gol avversario sbatte il ginocchio destro contro il palo, subendo un gravissimo infortunio e riportando la rottura del tendine rotuleo e del legamento crociato anteriore, posteriore e laterale.[10]
Il 18 luglio 2022, dopo avere trascorso una stagione al Barcellona senza giocare, viene ceduto all'HNK Gorica, con cui firma un annuale[11][12]; il 9 dicembre seguente si svincola dal club croato.[13]
Nazionale
Con la nazionale under-20 senegalese ha partecipato alla Coppa d'Africa 2015 e al Mondiale di Nuova Zelanda.[14] Ha esordito con la nazionale maggiore il 23 marzo 2017, nell'amichevole pareggiata per 1-1 contro la Nigeria.[15][16][17] Diventato in breve tempo membro fisso della squadra, nel mese di novembre ottiene la qualificazione al Mondiale di Russia 2018.[18] Nel successivo mese di maggio viene convocato per la rassegna iridata.[19] Il 24 giugno 2018 segna il suo primo goal in Nazionale nella partita dei gironi contro il Giappone (terminata poi 2-2), diventando il più giovane marcatore africano nella storia della competizione a 19 anni, 8 mesi e 20 giorni.[20][21][22]