【问题标题】:Typescript create map object with nested property打字稿创建具有嵌套属性的地图对象
【发布时间】:2017-11-26 10:22:10
【问题描述】:

这看起来很容易,但我真的无法让它发挥作用。我正在尝试将我的对象映射到另一个只有嵌套属性的对象。示例:

 const child1: Child<string> = { nested: "one" };
    const child2: Child<number> = { nested: 2 };

    type Child<T> = { nested: T };
    const abc = {
      child1,
      child2
}

const nestedOnly = {
  child1: abc.child1.nested,
  child2: abc.child2.nested
}

如何编写一个通用函数,它将任何对象作为参数并仅返回具有嵌套属性的对象而不会丢失特定类型?它的工作方式与 Array.map 类似。我试过这个:

function get<T>(ac: T){
  return Object
    .keys(ac)
    .reduce((result, currentKey) => {
      result[currentKey] = ac[currentKey].nested
      return result;
    }, {});
}

但它会丢失打字。我还尝试在 typescript 中创建映射类型并将其强制转换到这个函数中,但我无法弄清楚这个类型应该是什么样子。

这是我想出的一种类型:

type NestedType<T extends typeof abc> = {[P in keyof T]: T[P]['nested']}

它似乎工作正常,但是我需要在这里摆脱 typeof abc 因为它必须是通用函数。有没有办法说 T[P] 在这种类型中必须具有“嵌套”属性?

【问题讨论】:

  • 当你说“只有嵌套属性的对象”时,听起来就像你需要一个只有“嵌套”属性的接口。然后以此为基础。我想也许你只是缺少接口(使用多态性)。换句话说,如果您有一些只需要该接口的代码,那么只需将对象传递给它,就好像它是接口一样。当然,如果您需要在对象等上“实现 MyNextstedInterface”,但基本上这听起来您可以创建接口以在地图类型中使用。
  • 看Child type,就是你说的interrface吧?
  • 哇。好的。我的错。我认为你可能比我更擅长 TypeScript!我什至没有意识到“类型”关键字的存在,也没有意识到它甚至存在于语言中。

标签: typescript


【解决方案1】:

我想你已经很接近了。我会这样定义:

type NestedType<T extends { [k: string]: { nested: any } }> = {[P in keyof T]: T[P]['nested']}

所以T 必须扩展的类型是带有string 键的东西,其值包含nested 属性。

您可以验证NestedType&lt;typeof abc&gt; 是否有效并且符合您的预期。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2021-12-06
    • 1970-01-01
    • 2019-10-03
    • 2020-12-17
    • 2020-08-27
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多