簡體   English   中英

獲取類構造函數參數名稱

[英]Get class constructor argument names

我正在為 ES 類實現某種依賴注入解決方案,為此我需要知道類構造函數參數的確切名稱。

當我得到類或類靜態方法的字符串形式時,它確實提供了完整的代碼(通常用於函數),但對於類構造函數卻沒有。

class C { constructor(a, b) { }; static m(x,y) { } }
console.log(C);
console.log(C.constructor);
console.log(C.m);

結果是

class C { constructor(a, b) { }; static m(x,y) { } }
ƒ Function() { [native code] }
ƒ m(x,y) { }

結果,我必須解析整個類代碼以提取構造函數參數部分,使用像這樣的正則表達式

C.toString().split(/constructor\s*[^\(]*\(\s*([^\)]*)\)/m)

有沒有更簡潔的方法來獲取構造函數參數名稱?

更新:感謝您的所有意見和評論,但我非常清楚縮小是如何工作的,TS 裝飾器是如何工作的,Angular/AngularJS DI 是如何實現的以及它是如何工作的。 它與問題無關。 問題是:

是否可以像函數一樣獲取構造函數代碼?

不應將參數名稱視為識別要注入constructor的可靠方法。 正如您所注意到的,JavaScript並非旨在讓您以正確的方式檢索這些名稱,如果您處於瀏覽器上下文中,則可能在釋放代碼之前縮小代碼,從而導致名稱丟失。

JavaScript中的依賴注入機制通常依賴於元數據,例如Angular的元數據。 它使用TypeScript裝飾器將有序參數類型存儲在Map ,其中鍵是類本身,值是類Array 然后,由於簡單的引用比較(或instanceof ),可以檢查您的可注入對象池中是否已經實例化了所需的類。

FYI Loopback是另一個使用TypeScript和依賴注入的后端框架(在Node.js中運行)。

這是我想出的解決方案。 (我沒有試圖批評它在生產中的適航性,因為問題中沒有提到該要求;但是,我相信有些中小企業可以考慮與所討論的問題無關的特定場景,而該解決方案不會是理想的,甚至可能是危險的。注意:如果你正在從事密碼學工作,或者你在核電站工作,或者為美國宇航局工作,或者為自動汽車公司工作,或者為任何其他可能以任何方式濫用此代碼的公司工作或者根本沒有組織,但代碼仍然可能被濫用,我拒絕這個解決方案。當有人試圖使用你的框架並縮小代碼並且它不起作用並且他們報告時,請不要和你的律師一起來找我您的錯誤跟蹤器中存在問題,您必須在文檔中添加一些內容,說明您的框架不支持縮小或者您有需要縮小的代碼的解決方法,並且您的用戶就像“哦,好吧。哇為我服務。”)

var acorn = require("acorn")

class A {
  constructor(p1, p2) { }
}

const getClassConstructorParams = cls => {
  const ast = acorn.parse(cls.toString(), {
    ecmaVersion: 2020
  })
  return ast.body[0].body.body
    .find(x => {
      return x.type === 'MethodDefinition'
      && x.kind === 'constructor'
    })
    .value
    .params.map(x => x.name)
}


console.dir(
  getClassConstructorParams(A)
)

https://replit.com/@trevorhreed/parse-class-constructor-params#index.js

暫無
暫無

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

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