Typescript使用嵌套属性

时间:2017-11-26 00:33:29

标签: typescript

这似乎很容易,但我真的无法让它发挥作用。我试图将我的对象映射到只有嵌套属性的另一个对象。例如:

 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']}

它似乎工作正常,但我需要摆脱这里的类型abc因为它必须是通用函数。有没有办法说T [P]必须嵌套&#39;这类房产?

1 个答案:

答案 0 :(得分:1)

我认为你非常接近。我会这样定义:

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

因此T必须扩展的类型是string个键,其值包含nested属性。

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