簡體   English   中英

TypeScript singleton 由工廠生成 function 丟失分型

[英]TypeScript singleton generated with a factory function looses typings

我有一個含糖的 javascript SDK,其中庫在運行時的任何給定點被實例化,但從那時起就是 singleton。 如中,重復調用文件的default返回相同的實例。

我的問題是我的類型在庫的定義和實例化之間丟失了。

請參閱此代碼:

const Factory = (args?: Record<string, unknown>) => {

  return {
    action: {
        method: (code: 'SOME'|'CODES') => console.log('Doing something with', code)
    }
  }
}

let instance

export default (args?: Record<string, unknown>) => {

  if (!instance)
    instance = Factory(args)

  return instance

}

如果我直接實例Factory ,我就正確地提供了打字。 但是,文件的導出接口試圖確保實例始終返回 singleton。 在那個過程中,我們丟失了類型。

為了保留打字,我應該如何在這里輸入instance

約束:

  • 我不想在與定義松散匹配的界面中重新鍵入所有內容
  • 初始實例可以由用戶在運行時的任何時候實例化(不能假定在引導程序上創建)
  • 由於返回的嵌套方法的潛在復雜性,不應使用類。

您可以使用ReturnType實用程序類型來獲取Factory返回的實例的推斷類型,然后在instance類型和默認導出的返回類型中使用該類型。 請參閱下面LibInstanceType

const Factory = (args?: Record<string, unknown>) => {

  return {
    action: {
        method: (code: 'SOME'|'CODES') => console.log('Doing something with', code)
    }
  }
};

type LibInstanceType = ReturnType<typeof Factory>;

let instance: LibInstanceType | undefined;

export default (args?: Record<string, unknown>): LibInstanceType => {

  if (!instance)
    instance = Factory(args);

  return instance;

};

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM