Boas práticas? Será mesmo?
Usar prefixos para interfaces é um padrão adotado na comunidade do C# que nunca entendi a motivação. Justificar que é para identificar não me faz sentido, imagina usar C para identificar classes, CA para classes abstratas, O para objetos, S para identificar strings, DT para datas, A para arrays e por aí em diante, fica parencendo notação húngara.
A galera do Angular importou diversas práticas da comunidade C#, por isso é comum ver pessoas usarem essas convenções também.
Olhe o código abaixo, precisa de I para saber que DocumentExporter é uma interface? Acredito que não, o uso já dá legibilidade suficiente.
export class PDFExporter implements DocumentExporter {
async export(originPath: string, destinationPath: string): Promise<void> {
// ...
}
}
export class XLSXExporter implements DocumentExporter {
async export(originPath: string, destinationPath: string): Promise<void> {
// ...
}
}
Em tempos em que as IDEs e editores eram rústicos e limitados, até poderia ter alguma justificativa a para usar esse tipo de indicador. Mas hoje em dia você poderia chamar de uma convenção, não acho que possa classificar como boa prática.