【问题标题】:Is there a typescript type that stands for any iterable object是否有代表任何可迭代对象的打字稿类型
【发布时间】:2021-05-14 08:49:09
【问题描述】:

我们有如下函数

export const objectUndefinedToNull = (obj) => {
  const apply = (o) => {
    Object.keys(o).forEach((key) => {
      const value = o[key];
      if (value === undefined) {
        o[key] = null;
      }
      if (value instanceof Array || value instanceof Object) {
        apply(value || {});
      }
    });
  };
  apply(obj);
  return obj;
};

我想将所有anyunknown 类型替换为更合适的类型。 是否有任何类型代表任何可迭代类型,例如可以迭代的数组或对象?

【问题讨论】:

  • 是的,有:Iterable<T>
  • @Silvermind,谢谢,我不知道有这样的类型,但它似乎不适合我的情况,因为我希望能够传递类似 Record<string, someType> 的东西或 objectUndefinedToNull 对象上的 { [key: string]: someType }Iterable<T> 与上述类型的类型不匹配
  • 这能回答你的问题吗? Checking whether something is iterable
  • 不完全是,但我可以通过重写当前函数来使用它,只需使用类型谓词或类型保护来检查可迭代对象
  • 此代码实际上不适用于Record<string, someType> 等对象类型,对吗?它试图将未定义的对象值设置为 null,但 objectUndefinedToNull({ a: 1, b: undefined }) 返回 { 1: null, a: 1, b: undefined },这肯定不是预期的。据我所知,它仅适用于数组。 objectUndefinedToNull([1, undefined]) 返回 [1, null] 看起来更好。

标签: typescript typescript-generics


【解决方案1】:

您可以如下定义一个IterableType 类,然后使用它代替anyunknown

class IterableType<T> implements Iterable<T>, Record<K,T>

或者,按照您的原始代码继续使用anyunknown,但向函数添加一些类型检查以检查它是否是有效类型(数组、记录等)。

【讨论】:

  • 太棒了,谢谢你给我一个想法。我目前正在玩这个,似乎 Typescript 很难做到这一点。显然,您必须实现自己的Symbol.iterator
猜你喜欢
  • 2016-11-25
  • 2020-03-04
  • 2020-06-22
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2015-11-28
相关资源
最近更新 更多