我可以使用大型嵌套获得正确的类型

时间:2017-04-23 18:47:51

标签: typescript typescript2.0

我需要获得与result2相同的结果类型。是否可以通过更改函数 getNestedProperty 以某种方式解决它?

interface ILevel3 {
  level3: () => void;
}

interface ILevel2 {
  level2: ILevel3;
}
interface ILevel1 {
  level1: ILevel2;
}

const bigNestedObject: ILevel1 = {
  level1: {
    level2: {
      level3: () => {}
    }
  }
};

const result = getNestedProperty(bigNestedObject)('level1.level2.level3');
result(); // error type object 

const result2 = bigNestedObject.level1.level2.level3;
result2(); // it's ok type = () => void

const getNestedProperty = (root: object) => (propertyString: string): object => { 
  return propertyString
          .split('.')
          .reduce(<R, KPath extends keyof R>(acc: R, current: KPath): R[KPath] => acc[current], root);
}

我可以进入结果有效的type =()=&gt;无效?

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试重新安排代码。请注意const getNestedProperty使getNestedProperty成为块作用域变量。因此,在使用它之前,您需要声明变量。

另请注意,函数的最终返回类型是使用更高阶函数创建的,类型为object,缺少调用签名。因此,要调用返回的函数对象,将它as Function强制转换可能很有用。

以下是完整的示例:

//omitting interfaces for brevity

const bigNestedObject: ILevel1 = {
  level1: {
    level2: {
      level3: () => {
        console.log("Hello World");
      }
    }
  }
};

function core<R, KPath extends keyof R>(acc: R, current: KPath): any {
  return acc[current];
}

const getNestedProperty = (root: object) => (propertyString: string): object => { 

  //the core function can also be defined here inside getNestedProperty 

  return propertyString
          .split('.')
          //.reduce(<R, KPath extends keyof R>(acc: R, current: KPath): R[KPath] => acc[current], root);

          //the old commented code should also work, 
          //but note this makes the code easier to read.
          .reduce(core, root); 
}

const result = getNestedProperty(bigNestedObject)('level1.level2.level3');
console.log(result); // [Function: level3] 

const result2 = bigNestedObject.level1.level2.level3;
console.log(result2); // [Function: level3]

(result as Function)(); //Hello World

希望这有帮助。

更新:上面的代码已更改,并在下面Aluan Haddad按照建议发表评论。请注意,添加了新的core函数(找到更好的名称),因为它使代码更容易理解。评论的旧代码也应该有用。