请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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回答

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


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

https://img1.sycdn.imooc.com//szimg/63779fe309788b0b10240381.jpg



1 回复 有任何疑惑可以回复我~
  • 提问者 目訫 #1
    老师,我尝试用type ConstructorType = new <T>(...arg: any) => T这种写法代替type ConstructorType<T> = new (...arg: any) => T为什么不可以
    回复 有任何疑惑可以回复我~ 2022-11-21 19:53:37
  • keviny79 回复 提问者 目訫 #2
    没太明白在哪里代替,直接把不行代码发出来,我看下
    回复 有任何疑惑可以回复我~ 2022-11-23 21:46:00
  • keviny79 回复 提问者 目訫 #3
    同学问题已通过课程群解决
    回复 有任何疑惑可以回复我~ 2022-11-26 13:48:50
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号