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

时间:2017-02-02 21:46:00

标签: dart

例如,我希望能够写下来:

class Dog {
  final String name;

  Dog(this.name);

  bark() => 'Woof woof said $name';
}

#Dog.bark的类型定义为() => String

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

  3. 在推断出的代码与不是代码的代码之间有一个简单的界限,用户可以轻松地推断出代码的哪些部分是类型安全的,哪些部分需要更多关注。

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

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

    • Dart会根据其正文推断匿名函数的返回类型。这使得传递给map()的lambda这样的事情做你想做的事。

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

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