Typescript 我可以得到一个大嵌套正确的类型吗
我需要得到与result2相同的结果类型。是否可以通过更改函数getNestedProperty以某种方式解决此问题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: {
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要点:)您可以查看更新的答案