函数返回值,定义为void类型。这段代码,不会被编译通过
const func=function(str:string):void{
return str
}
但是这段代码,却可以编译通过,这是为什么
const func:(str:string)=>void=function(str){
return str
}
函数返回值,定义为void类型。这段代码,不会被编译通过
const func=function(str:string):void{
return str
}
但是这段代码,却可以编译通过,这是为什么
const func:(str:string)=>void=function(str){
return str
}
1.可以将这认为是一种缺陷,因为函数标识符的类型注解本身就是约束赋给标识符的函数的一种规范了,但是在定义函数时函数本身却又可以对参数和返回值再指定类型注解,这样比较繁琐。
2.可以将这认为是一种优先级的问题,即,函数定义时指定的类型注解的优先级大于给函数标识符指定的类型注解。
我个人比较倾向于第二种解释,因为直到此时此刻,该情况依然存在。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
第一种方法通不过,是由于返回值与声明的值不同。
第二种方法能过过,是由于返回值与声明的值相同。
把第二种方式简单给换一种写法,至于能不能理解,看自己的积累吧。
格式化:
补充返回类型,变量类型
再转化为两步式写法:先声明,再赋值
改变返回值类型,编译通过:
再改变返回值类型,编译错误:
原因猜想:
typescript是个规范,它最终是要编译为js的,由于js是弱类型,所以ts也不是真正的强类型语言。它的强类型的目的是进行约束。比如有以下代码,不会发生错误:
虽然data并不完全与_data匹配,但并不影响func1的正确执行。所以不报错。
同理:func声明为void返回值,即使是最终func的返回值是string,那么也不会影响其它的调用者对其进行的调用,所以不报错:
编译➋时,会按➊的规范来判断调用是否错误,所以不报错。➌返回值为string,并不影响其它返回值声明为void的调用,也不报错。
但以下调用会报错:
在编辑➊时,会根据➋声明的返回类型。string与void并不符,所以报错。
总结:
写在最后,如果是新人,应该避免将精力浪费在这种前期毫无意义的知识点上。你知道它不多,不知道它也不少。不如把此精力放到更多的应用场景上,应用的多了自然就懂了,最重要的,那时候的懂是不会忘的懂;而现在懂,过1周自己就正常遗忘了。