typescript 函数返回定义void,却可以返回其他类型?

函数返回值,定义为void类型。这段代码,不会被编译通过

const func=function(str:string):void{
  return str
}

但是这段代码,却可以编译通过,这是为什么

const func:(str:string)=>void=function(str){
  return str
}

阅读 7.3k
2 个回答

第一种方法通不过,是由于返回值与声明的值不同。
第二种方法能过过,是由于返回值与声明的值相同。
把第二种方式简单给换一种写法,至于能不能理解,看自己的积累吧。

const func:(str:string)=>void=function(str){
  return str
}

格式化:

    const func: (str: string) => void = function(str) {
      return str;
    };

补充返回类型,变量类型

    const func: (str: string) => void = function(str: string): string {
      return str;
    };

再转化为两步式写法:先声明,再赋值

    let func: (str: string) => void;
    func = function(str: string): string {
      return str;
    };

改变返回值类型,编译通过:

    let func: (str: string) => string;
    func = function(str: string): string {
      return str;
    };

再改变返回值类型,编译错误:

    let func: (str: string) => number;
    func = function(str: string): string {
      return str;
    };

原因猜想:
typescript是个规范,它最终是要编译为js的,由于js是弱类型,所以ts也不是真正的强类型语言。它的强类型的目的是进行约束。比如有以下代码,不会发生错误:

    const func1 = (_data: { a: number }) => {
    };
    const data = {a: 12, b: 32};
    func1(data);

虽然data并不完全与_data匹配,但并不影响func1的正确执行。所以不报错。

同理:func声明为void返回值,即使是最终func的返回值是string,那么也不会影响其它的调用者对其进行的调用,所以不报错:

    let func: (str: string) => void; ➊
    func = function(str: string): string➌ {
      return str;
    };

    func('hebut');➋

编译➋时,会按➊的规范来判断调用是否错误,所以不报错。➌返回值为string,并不影响其它返回值声明为void的调用,也不报错。

但以下调用会报错:

    let func: (str: string) => void;➋
    func = function(str: string): string {
      return str;
    };

    const a: string➊ = func('hebut');

在编辑➊时,会根据➋声明的返回类型。string与void并不符,所以报错。



总结:
  1. 函数定义时,直接定义,返回值与声明的值不相同,编译不通过,正常。
  2. 先定义函数参数及返回值,再定义函数,则在定义过种中,只要参数、返回值并不影响其它调用者的正常执行,则不报错;如果影响其它调用者的执行,则报错。
  3. 在进行编译时,先声明后赋值的函数,会按函数的声明进行编译。



写在最后,如果是新人,应该避免将精力浪费在这种前期毫无意义的知识点上。你知道它不多,不知道它也不少。不如把此精力放到更多的应用场景上,应用的多了自然就懂了,最重要的,那时候的懂是不会忘的懂;而现在懂,过1周自己就正常遗忘了。
新手上路,请多包涵

1.可以将这认为是一种缺陷,因为函数标识符的类型注解本身就是约束赋给标识符的函数的一种规范了,但是在定义函数时函数本身却又可以对参数和返回值再指定类型注解,这样比较繁琐。
2.可以将这认为是一种优先级的问题,即,函数定义时指定的类型注解的优先级大于给函数标识符指定的类型注解。
我个人比较倾向于第二种解释,因为直到此时此刻,该情况依然存在。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题