课程中的思考题:为什么返回的匿名函数可以简写

来源:9-14 【泛型工厂函数在装饰器中的应用】——装饰器中 ClassDecorator 的替代写法

目訫

2022-11-16

type MyClassDecorator = <T>(targetClass: new (arg: any) => T) => any

function Controller(rootPath: string): MyClassDecorator {
  return function (targetClass) {

  }
}

这里返回的匿名函数不需要写返回值类型的原因是,外层函数已经规定返回值的类型,方法体根据这个类型推导出匿名函数的返回值类型

其实还有一点理解

 return function (targetClass) {}

其实也可以这么写

 return function (targetClass: any): any {}

因此不会报错


这里向老师请教一个问题,为什么这节课

type MyClassDecorator = <T>(targetClass: new (arg: any) => T) => any

泛型出现在等号右边,工厂函数的自定义类型是

type a<T> = new (...arg: any) => T

这两个有什么不同吗?


学生理解的是这节课的自定义类型MyClassDecorator完全是为了迎合Controller方法的返回值而产生的没什么具体含义,和工厂函数的自定义类型不一样,而工厂函数的泛型之所以是在左边是因为需要在自定义类型声明泛型,如果在右边声明泛型,那个创建的类的构造函数也要声明相应泛型,但是构造函数中不可以使用泛型,因此需要在等号左边定义泛型


请老师帮忙解答,谢谢


写回答

1回答

keviny79

2022-11-18

1.为什么返回的匿名函数可以简写回答正确,加一点: MyClassDecorator 规定了函数的参数类型和返回值类型,同时由于MyClassDecorator 返回值类型为 any,而 function (){  } 返回值为 void, any 可以兼容 void. 


2. 如果定义时把泛型<T>写在右边, 使用泛型时不需要具体化泛型的值,见图

//img.mukewang.com/szimg/63779fe309788b0b10240381.jpg



1
4
目訫
非常感谢!
2022-11-29
共4条回复

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程