【问题标题】:Is it possible to require generic type arguments on a Dart class?是否可以在 Dart 类上要求泛型类型参数?
【发布时间】:2018-09-12 01:17:10
【问题描述】:

一个常见的问题,特别是自 Dart 2 以来,是否有可能要求一些或所有类型的一些或所有泛型类型参数 - 例如 List<int> 而不是 List 或 @ 987654324@ 而不是 MyType

虽然意图是什么并不总是很清楚 - 即这是一个风格问题(您/您的团队喜欢查看类型),以防止错误(省略类型参数似乎会导致更多您/您的团队的错误),或作为合同问题(您的库期望类型参数)。

例如,在dart-misc,用户写道:

基本上,如果我有这个:

abstract class Mixin<T> {}

我没有来指定类型:

// Works class Cls extends Object with Mixin<int> {} // ...also works
class Cls extends Object with Mixin {}

有没有办法让第二个不被允许?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    严格来说,是的,不是。

    如果您想强制在您自己的项目中始终使用类型参数(而不是依赖类型推断或默认值),您可以使用 optional linter rules such as always_specify_types .请注意,此规则在许多情况下违反了官方 Dart 样式指南的建议 AVOID redundant type arguments on generic invocations

    如果你想强制 generic 类型参数 always 使用 when 默认值会令人困惑 - 例如 List 隐含意思List&lt;dynamic&gt;不存在这样的 lint - 尽管我们计划将其添加为分析器的 模式https://github.com/dart-lang/sdk/issues/33119


    以上两个建议都会对你自己有所帮助,但是如果你正在创建一个库供其他人使用,你可能会问你是否可以require 一个类型参数来使用你的类。例如,从上面:

    abstract class Mixin<T> {}
    abstract class Class extends Object with Mixin {}
    

    您可以做的第一件事是为T 添加一个默认边界:

    // If T is omitted/not inferred, it defaults to num, not dynamic.
    abstract class Mixin<T extends num> {}
    

    如果你想允许任何东西,但又想在T 是动态的时候难以使用你的类/mixin,你可以选择不同的默认绑定,例如Object,甚至更好I recommend void:

    在实践中,我使用void 来表示“任何事情,我不关心元素”

    abstract class Mixin<T extends void> {
      T value;
    }
    
    class Class extends Mixin {}
    
    void main() {
      var c = Class();
      // Compile-time error: 'oops' isn't defined for the class 'void'.
      c.value.oops();
    }
    

    (您也可以为此使用Object

    如果这是您控制的类,您可以添加一个断言,以防止该类以您不支持或不期望的方式使用。例如:

    class AlwaysSpecifyType<T> {
      AlwaysSpecifyType() {
        assert(T != dynamic);
      }
    }
    

    最后,您可以编写一个自定义 lint 或工具来禁止省略某些泛型类型参数,但这可能是最大的工作量,如果前面的任何方法都适合您,我强烈推荐那些!

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 2011-08-18
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2010-12-16
      相关资源
      最近更新 更多