我需要获得与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;无效?
答案 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
函数(找到更好的名称),因为它使代码更容易理解。评论的旧代码也应该有用。