如何检查对象是否可以静态迭代?

时间:2019-07-31 21:12:54

标签: typescript iterable

我有一个需要迭代的函数:

function fn(ary) {
    for (let value of ary)
        console.log(value)
}

在javascript中,我会利用Symbol.iterator

  
function isIterable(obj) {
    // checks for null and undefined
    if (obj == null) {
        return false;
    }
    return typeof obj[Symbol.iterator] === 'function';
}

来自Tomas Kulich original answer

这将导致下一个代码:

function fn(ary) {
    if (!isIterable(ary)) throw 'Not iterable'

    for (let value of ary)
        console.log(value)
}

难道没有办法利用TypeScript的键入工具而不是使用此即时函数吗?

1 个答案:

答案 0 :(得分:2)

有一种Iterable类型可以做到这一点:

function fn(ary: Iterable<any>) {
    for (let value of ary)
        console.log(value)
}

Corresponding TypeScript playground here

请注意,Iterable需要on类型参数。 any允许您专门检测 just 是否可迭代对象,尽管您可以进一步指定要迭代的对象(例如Iterable<Number>)。