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

How can I check whether an object is iterable statically?

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

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 的输入功能而不是使用这个即时功能?

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

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

Corresponding TypeScript playground here.

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