Faits: A. Le 1er avril 1998, A._ a pris à bail un appartement de trois pièces dans un immeuble sis à Genève. Conclu pour un an, le contrat se renouvelait ensuite d'année en année, sauf résiliation signifiée trois mois avant l'échéance. Le loyer annuel, charges comprises, s'élevait à 8'232 fr. En 2003, X._ est devenue propriétaire de l'immeuble précité. La locataire a vécu dans l'appartement avec son fils majeur, B._, jusqu'au 1er avril 1999. A cette date, elle a quitté les lieux et sous-loué le logement à son fils. Ce dernier a épousé C._ en juillet 2003; le couple a occupé l'appartement sous-loué jusqu'à sa séparation en décembre 2004. Par jugement du 27 mai 2005, le Tribunal de première instance de Genève a, dans le cadre de mesures protectrices de l'union conjugale, attribué la jouissance exclusive du logement susmentionné à C._. L'avocat de celle-ci a communiqué la décision judiciaire à la régie représentant la bailleresse. Par lettre du 19 août 2005, la gérance s'est étonnée auprès de A._ d'apprendre qu'elle ne semblait plus occuper le logement loué; la locataire était mise en demeure de fournir des explications, faute de quoi elle s'exposait à une résiliation du bail. Dans sa réponse du 28 août 2005, A._ a confirmé avoir quitté l'appartement en avril 1999, le laissant à son fils à partir de cette date; elle affirmait avoir demandé alors à la régie si le bail pouvait être transféré à B._; il lui aurait été répondu que cela n'était pas nécessaire dès lors qu'il avait le droit d'habiter dans l'appartement en tant que fils de la locataire. A._ précisait que, lorsqu'elle avait appris l'attribution judiciaire du logement familial à sa belle-fille, elle avait immédiatement demandé à la gérance, par téléphone, si le bail pouvait être transféré à C._, possibilité que la régie s'était engagée à examiner. Par pli recommandé du 7 octobre 2005, la gérance a mis A._ en demeure de réintégrer le logement sous-loué sans autorisation jusqu'au 15 novembre 2005, l'avertissant qu'à défaut, le bail serait résilié pour justes motifs. La locataire n'a pas donné suite à cette correspondance. Par courrier recommandé et avis officiel du 23 mars 2006, X._ a résilié le bail de manière anticipée pour le 31 mai 2006. B. Par requête déposée le 21 avril 2006, A._ a contesté le congé. Dans une décision du 23 octobre 2006, la Commission de conciliation en matière de baux et loyers a déclaré valable le congé notifié pour le 31 mai 2006 et accordé à la locataire une prolongation unique du bail jusqu'au 31 janvier 2007. A._ a porté la cause devant le Tribunal des baux et loyers du canton de Genève, reprenant notamment ses conclusions en annulation du congé. Par jugement du 4 avril 2007, le Tribunal des baux et loyers a déclaré inefficace le congé notifié le 23 mars 2006. La bailleresse a interjeté appel; elle faisait valoir notamment que la locataire n'avait aucunement l'intention de revenir vivre un jour dans l'appartement loué. Statuant le 3 mars 2008, la Chambre d'appel en matière de baux et loyers du canton de Genève a confirmé le jugement de première instance. En substance, la cour cantonale a jugé que la sous-location incriminée était admissible au regard de l'art. 262 al. 2 CO, dès lors qu'elle intervenait à des conditions extrêmement proches de celles du bail principal et que la bailleresse n'avait pas démontré son besoin d'attribuer le logement en cause à une autre personne que «son occupant actuel»; la bailleresse ne pouvait ainsi résilier le bail de manière anticipée sur la base de l'art. 257f al. 3 CO. C. X._ forme un recours en matière civile. Elle demande que l'arrêt cantonal soit annulé et que le congé notifié le 23 mars 2006 soit déclaré valable. Par ordonnance du 30 avril 2008, un délai au 2 juin 2008 a été imparti à A._ pour déposer une réponse éventuelle. L'intimée a remis une écriture à la poste en date du 3 juin 2008.