在Dart的强模式中,我可以从函数定义中省略类型吗?

mat*_*rey 5 dart

例如,我想能够写:

class Dog {
  final String name;

  Dog(this.name);

  bark() => 'Woof woof said $name';
}
Run Code Online (Sandbox Code Playgroud)

但是有#Dog.bark类型定义() => String.

以前这在Dart 1.x中是不可能的,但是我希望类型推断可以节省一天,并且避免必须键入简单的函数,其中返回类型是可推断的(与今天的闭包相同?)

mun*_*ent 6

语言团队目前没有任何计划根据其成员对成员返回类型进行推断.肯定有这样的情况,它会很好,但还有其他情况(如递归方法),它不起作用.

通过推论,我们必须平衡一些对立的力量:

  1. 通过智能推理处理大量不同的案例,以尽可能减轻打字的痛苦.

  2. 有一些明确的类型注释,以便像API边界这样的东西定义明确.如果更改方法体并更改推断的返回类型,那么现在您已经对API进行了可能的重大更改.

  3. 在推断的代码和不是这样的代码之间有一个简单的边界,用户可以很容易地推断出他们的代码的哪些部分是类型安全的,哪些需要更多关注.

你提出的案例恰好在这些案例的交叉点.就个人而言,我倾向于不推断.我喜欢我的类API非常明确地输入,因为我发现它使它们更容易阅读和维护.

请记住,有类似的情况,推理确实发挥作用:

  • Dart将根据其主体推断匿名函数的返回类型.这使得像lambdas这样的东西被传递map()去做你想要的.

  • 它将从它覆盖的方法推断方法覆盖的返回类型.您无需在Beagle.bark()此处注释返回类型:

    class Dog {
      String bark() => "Bark!";
    }
    
    class Beagle extends Dog {
      final String name;
    
      Dog(this.name);
    
      bark() => 'Woof woof said $name';
    }
    
    Run Code Online (Sandbox Code Playgroud)