typescript - Injicera lista av gränssnitt till en klass - NestJs
Låt oss säga att jag har detta gränssnitt:
export interface IParser {
parse(text: string):string
}
och ett par klasser som implementerar gränssnittet:
@Injectable()
export class FirstParser implements IParser {
public parse(text: string): string {
return text + 'first';
}
}
@Injectable()
export class SecondParser implements IParser {
public parse(text: string): string {
return text + 'second';
}
}
Nu har jag en tjänst som jag försöker injicera i hans lista över parser:
@Injectable()
export class ParserService {
constructor(private readonly parsers: IParser[]) {}
public parse(text: string): string {
let parsedText = text;
parsedText = this.parsers.reduce((acc: string, result) => {
return result.parse(acc);
}, parsedText);
return parsedText;
}
}
Jag försöker få appmodulen (i det här fallet parser-service.module.ts) att fungera genom att injicera en array/lista av klassen inklusive FirstParser, SecondParser.
@Module({
providers: [
ParserService,
{
provide: Array<IParser>,
useClass: ???,
},
],
})
export class ParserServiceModule {}
Några idéer? Är det alls möjligt i NestJs?
Tack.
Svar #1
Den funktionalitet du försöker uppnå har redan efterfrågats som en funktion men har inte implementerats på grund av låg prioritet. Ta en titt på funktionsförfrågan.
Du kan dock använda factory provider-funktionen genom att göra IParser-implementationerna till en array.
@Module({
providers: [
FirstParser,
SecondParser,
{
provide: 'Parser',
useFactory: (...parsers) => new ParserService(parsers),
inject: [FirstParser, SecondParser],
},
],
})
export class ParserServiceModule {}
