Typescript 我可以得到一个大嵌套正确的类型吗

Typescript 我可以得到一个大嵌套正确的类型吗,typescript,typescript2.0,Typescript,Typescript2.0,我需要得到与result2相同的结果类型。是否可以通过更改函数getNestedProperty以某种方式解决此问题 interface ILevel3 { level3: () => void; } interface ILevel2 { level2: ILevel3; } interface ILevel1 { level1: ILevel2; } const bigNestedObject: ILevel1 = { level1: { level2: {

我需要得到与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);
}
接口ILevel3{
第三级:()=>无效;
}
接口ILevel2{
二级:三级;
}
接口ILevel1{
一级:二级;
}
常量bigNestedObject:ILevel1={
第1级:{
第2级:{
级别3:()=>{}
}
}
};
const result=getNestedProperty(bigNestedObject)('level1.level2.level3');
结果();//错误类型对象
const result2=bigNestedObject.level1.level2.level3;
结果2();//没关系type=()=>void
const getNestedProperty=(根:对象)=>(propertyString:string):对象=>{
返回属性字符串
.split(“.”)
.reduce((acc:R,current:KPath):R[KPath]=>acc[current],root);
}

我可以进入结果有效类型=()=>无效吗?

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

还要注意的是,函数的最终返回类型是由高阶函数生成的
object
类型,它缺少调用签名。因此,要调用返回的函数对象,将其转换为
函数
可能很有用

下面是完整的示例:

//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
//为了简洁起见省略了接口
常量bigNestedObject:ILevel1={
第1级:{
第2级:{
第三级:()=>{
log(“你好世界”);
}
}
}
};
功能核心(acc:R,current:KPath):任意{
返回acc[当前];
}
const getNestedProperty=(根:对象)=>(propertyString:string):对象=>{
//核心函数也可以在getNestedProperty中定义
返回属性字符串
.split(“.”)
//.reduce((acc:R,current:KPath):R[KPath]=>acc[current],root);
//旧的注释代码也应该可以工作,
//但请注意,这使代码更易于阅读。
.减少(核心、根);
}
const result=getNestedProperty(bigNestedObject)('level1.level2.level3');
console.log(结果);//[职能:三级]
const result2=bigNestedObject.level1.level2.level3;
console.log(result2);//[职能:三级]
(结果为函数)()//你好,世界
希望这有帮助



更新:上面的代码已更改,并根据下面的建议对ass进行了注释。请注意,添加了新的
核心
函数(查找更好的名称),因为它使代码更易于理解。如注释所示,旧代码也应该有效。

+1。为了便于阅读,我建议您将reduce函数提取到嵌套函数或
const
声明中?@AluanHaddad感谢您的建议。它确实会提高可读性。但是,代码取自OP,我想将其保留为当前状态,因为这不会导致问题,我不是在审查代码,而是为所述问题提供解决方案。希望您理解。@AluanHaddad要点:)您可以查看更新的答案