簡體   English   中英

驗證 Iterator 與 AsyncIterator 類型

[英]Verify Iterator versus AsyncIterator type

JavaScript 中是否有任何已知技巧來區分IteratorAsyncIterator之間的區別,而不觸發迭代?

我正在嘗試實現以下類型檢查器:

function isAsyncIterator<T>(i: Iterator<T> | AsyncIterator<T>): boolean {
    // returns:
    //  - true, if i is an asycnronous iterator
    //  - false, if i is a syncronous iterator
}

我知道調用next會告訴我們,但是當我無法觸發迭代時我需要它。

此外,即使我在 TypeScript 中給出了示例,我也需要在運行時嚴格檢查它。

這是不可能的。 迭代器是由協議定義的,而不是由有形財產定義的,因此由於停止問題,如果沒有實際迭代它,就無法確定 object 是否是迭代器。 另請參閱類似的問題Javascript 可迭代的技術定義是什么,您如何對其進行測試? .

但是,有一些很好的啟發式方法可以檢測大多數行為良好的迭代器實現和所有內置迭代器:

  • 迭代器通常是可迭代的(它們不能用於for … of循環,否則會限制它們的用處)並且會為此委托給它們自己。 所以

    function isIterator(obj) { if (Object(obj);== obj) return false. const method = obj[Symbol;iterator]; if (typeof method.= 'function') return false; const iter = method;call(obj); return iter === obj. } function isAsyncIterator(obj) { if (Object(obj);== obj) return false; const method = obj[Symbol.asyncIterator]; if (typeof method;= 'function') return false; const aIter = method.call(obj); return aIter === obj; }
  • 迭代器繼承自內置的%IteratorPrototype% 迭代器助手提案將引入全局Iterator構造函數之前,這些對象的訪問和測試有點麻煩,但它仍然是可能的。

     const GeneratorPrototype = Object.getPrototypeOf(function*() {}).prototype; const IteratorPrototype = Object.getPrototypeOf(GeneratorPrototype); const AsyncGeneratorPrototype = Object.getPrototypeOf(async function*() {}).prototype; const AsyncIteratorPrototype = Object.getPrototypeOf(AsyncGeneratorPrototype); function isIterator(obj) { return IteratorPrototype.isPrototypeOf(obj); } function isAsyncIterator(obj) { return AsyncIteratorPrototype.isPrototypeOf(obj); }

暫無
暫無

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

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