代码之家  ›  专栏  ›  技术社区  ›  Anne

类型不一致的对象的TypeScript类型定义

  •  0
  • Anne  · 技术社区  · 1 年前

    我有一个类似JSON的大型对象,它有很多嵌套,但最终变成了。我希望能够创建一个类型安全的函数,用于从嵌套结构中提取任何任意字符串或对象。

    例如,这里有一个类似于我的结构:

    const obj = {
      "keyA": {
        "nestedA1": "string",
        "nestedA2": "string"
      },
      "keyB": {
        "nestedB1" : {
          "doubleNested1": "string",
          "doubleNested2": "string"
        }
      }
    }
    

    我编写了以下函数,它在最终嵌套级别工作,以从对象中获得类型安全的字符串:

    const getConfig = <T extends string>(collection: Record<T, string>, key: T): string => {
      return collection[key];
    }
    

    这适用于以下用例,按照我希望的方式。

    getConfig(obj.keyA, "nestedA1") // compiles
    getConfig(obj.keyB.nestedB1, "doubleNested") // compiles
    getConfig(obj.keyA, "somethingRandom") // compile error
    

    然而,我真的希望能够从结构中不仅选择字符串,还选择强类型对象。例如,我希望能够做到以下几点:

    getConfig(obj.keyB, "nestedB1").doubleNested1
    getConfig(obj, "keyA").nestedA1
    

    我想修改函数的类型签名,以表明它可以返回正确类型的字符串或对象,AND,这样我就可以继续深入到返回的对象中。我该怎么做?尤其是当类型不是 Record<T,R> 例如,因为不是每个 R 对象中的值具有相同的类型(即, keyA keyB 没有相同类型的签名)

    非常感谢。

    0 回复  |  直到 1 年前