【问题标题】:don't use object as a type不要使用对象作为类型
【发布时间】:2021-02-27 07:53:12
【问题描述】:

我收到 lint 错误:

不要使用对象作为类型

当我使用对象作为类型时,示例如下:

export const myFunc = (obj: object): string => {
  return obj.toString()
}

知道我应该为具有未知属性的对象赋予什么类型吗?

如果有帮助的对象不是数组(我知道它在 JS 中严格来说是一个对象)

提前致谢

【问题讨论】:

标签: typescript eslint tslint


【解决方案1】:

有几种不同的方法可以做到这一点。一般来说,我觉得这样做有点反模式。

但我可能会选择Record<string, any>,如果这能满足你的话。

【讨论】:

    【解决方案2】:

    我认为这里最好的方法是使用泛型:

    export const myFunc = <T extends { toString: () => string }>(obj: T): string => {
        return obj.toString()
    }
    
    myFunc(2) // no error
    myFunc({}) // no error
    

    如果您想将参数限制为仅对象,那么是的,@Evert 的解决方案是好的。 但为了类型安全,最好使用unknown 而不是any

    Record<string, unknown>
    

    【讨论】:

      【解决方案3】:

      以下是 linter 规则建议不要使用 object 类型的具体示例:

      function foo(obj: object) {
          for (const key in obj) {
              const val = obj[key]; // Compilation error: type 'string' can't be used to index type '{}'
          }
      }
      
      function bar(obj: { [key: string]: unknown }) {
          for (const key in obj) {
              const val = obj[key]; // works :)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2011-01-13
        • 2017-08-15
        • 1970-01-01
        • 2017-06-09
        • 2021-12-17
        相关资源
        最近更新 更多