ค้นหาเว็บไซต์

typescript - วิธีซ่อนบริการจาก public_api.ts ในไลบรารี Angular


ผมกำลังมองหาวิธีสร้างไลบรารี Angular (7.2.15) แบบแชร์ได้ และต้องการเผยเฉพาะคลาสนามธรรมที่ผมใช้เป็นอินเทอร์เฟซใน public_api.ts อย่างไรก็ตาม ผมยังคงพบข้อผิดพลาดที่บอกว่า ไม่สามารถหาโมดูล './lib/my-module/my.service'.

เหตุผลสำหรับเรื่องนี้คือฉันต้องการบริการแบบซิงเกิลตันเพื่อบันทึกเหตุการณ์ในคอมโพเนนต์ของไลบรารีของฉัน และให้บริการเหล่านั้นกับแอปพลิเคชันภายนอกผ่าน EventEmitter ฉันต้องการให้แอปพลิเคชันตัวเองสามารถเข้าถึง EventEmitter เท่านั้น และไม่เข้าถึงวิธีการอื่น ๆ ของบริการ ดังนั้นฉันจึงสร้างบริการของฉันดังนี้:

my.service.ts

@Injectable()
export class MyService implements AppInterface, LibraryInterface {
  private _events: Subject<string>

  public getEventObservable (): Observable<string> {
    return this._events.asObservable()
  }

  public addEvent (eventCode: string): void {
    this._events.next(eventCode)
  }
}

อินเทอร์เฟซแอป.ts

export abstract class AppInterface {
  public abstract getEventObservable (): Observable<string>
}

อินเทอร์เฟซห้องสมุด.ts

export abstract class LibraryInterface {
  public abstract addEvent (eventCode: string): void
}

ฉันกำลังมองหาวิธีที่จะให้บริการในรูปแบบโมดูลในไลบรารีของฉันดังนี้: { provide: AppInterface, useClass: MyService }, { provide: LibraryInterface, useClass: MyService } อย่างไรก็ตาม ถ้าฉันให้ AppInterface ในโมดูลที่ถูกส่งออกใน public_api.ts มันจะบังคับให้ฉันต้องส่งออกทั้ง interface และ service ใน public_api.ts มิฉะนั้นฉันจะเจอข้อผิดพลาดตามย่อหน้าแรก ฉันเพียงต้องการให้แอปที่ใช้ไลบรารีของฉันสามารถนำเข้า interface ได้เท่านั้น ไม่ใช่ service

ปัญหาเพิ่มเติมอีกอย่างหนึ่งที่ดูเหมือนผมจะแก้ไม่ได้คือ ถ้าผมไม่เคยให้ AppInterface ที่ไหนเลย และให้ LibraryInterface ในโมดูลที่ไม่ถูกส่งออกใน public_api.ts ผมก็ยังเจอข้อผิดพลาดอยู่ ไม่แน่ใจว่าทำไมมันถึงคาดหวังให้ผมให้บริการภายในที่ไม่เคยถูกเปิดให้แอปใช้...