【问题标题】:How do I use Type Aliases / Typedefs (also non-function) in Dart?如何在 Dart 中使用类型别名/类型定义(也是非函数)?
【发布时间】:2021-06-25 01:22:18
【问题描述】:

我很早就知道 Dart 中的function typedefs。它们也在this question 的回答中进行了解释。

现在,我听说 非函数类型别名(或非函数类型定义)将进入 Dart。


我想知道两件事:

  • Dart 中的(非函数)typedef 到底是什么?
  • 如何使用它们(在我的 Flutter 项目中)?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Dart 中的通用类型别名/类型定义

    您可以查看feature specification for Generalized type alisases 以获得完整的设计文档。

    我想先指出 Dart 过去只支持 for 函数 的 typedef。 新的通用功能支持任何类型的typedef。

    typedef JsonMap = Map<String, dynamic>;
    
    JsonMap parseJsonMap(String input) => json.decode(input) as JsonMap;
    

    当您有多个泛型类型(类型参数)导致键入冗长的类型名称时特别有用,例如Map&lt;ScaffoldFeatureController&lt;SnackBar, SnackBarClosedReason&gt;, SnackBar&gt;。现在可以使用类型别名来简化:

    typedef ScaffoldSnackBarMap = Map<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>, SnackBar>;
    

    语法

    如果从上面的例子中看不清楚,这是类型别名/类型定义的语法:

    'typedef' identifier typeParameters? '=' type ';'
    

    这意味着您始终需要以 typedef 关键字开头,后跟所需的标识符,例如FooTypeDef。之后,您可以添加类型参数,例如Foo&lt;K, V&gt;。最后一步是添加= 符号,后跟要为其创建别名的实际类型。这可以是任何类型,即类、原始类型、函数类型或 w/e。不要忘记最后的; ;)

    // Type parameters / generic types in typedef.
    typedef Foo<K, V> = Map<K, V>;
    
    // Type alias for regular types.
    typedef Bar = Widget;
    // As well as primitive types.
    typedef Baz = int;
    
    // Function types are also supported.
    typedef FooFunction<T, R> = R Function(T param);
    

    弃用名称

    此外,您可以将typedefs 用于任何类 名称。假设您想将您的课程从 Provider 重命名为 Pod,因为您认为前者过于冗长。如果您正在维护一个包,这将是一个重大更改。使用新的通用类型别名,您可以简单地重命名您的类并创建一个您不赞成使用的类型别名:

    class NewClassName<T> {}
    
    @Deprecated("Use NewClassName instead")
    typedef OldClassName<T> = NewClassName<T>;
    

    请注意,此示例和上面的示例取自该功能的 proposed CHANGELOG entry。

    如何使用它们

    默认情况下该功能将随 Dart 2.13 提供,但目前仍处于试验阶段。我将介绍如何以两种方式使用它;实验方法可以稍后删除。

    飞镖 2.13

    正如我之前提到的,该功能将从 Dart 2.13 开始默认启用。如果您当前已经安装了 Dart 2.13(例如,您可以使用dart --version 进行检查),您可以使用此方法。否则,您应该参考下面的实验支持部分。

    在您的pubspec.yaml 中,您需要将 Dart SDK 约束的下限定义为大于或等于2.13.0:

    environment:
      dart: '>=2.13.0 <3.0.0'
    

    实验支持

    在您的 Flutter 项目(或任何其他 Dart 项目)中,您当前需要将它们启用为 an experiment。这意味着它们隐藏在功能标志后面。


    可以使用analysis_options.yaml 配置实验性 Dart 功能。您只需在项目目录的根目录中创建一个analysis_options.yaml file 并添加以下行:

    analyzer:
      enable-experiment:
        - nonfunction-type-aliases
    

    现在,您还需要在运行(或构建)应用时启用实验:

    flutter run --enable-experiment=nonfunction-type-aliases
    

    为确保您可以使用此功能,请使用master 频道(使用 Flutter 时为flutter channel master)。

    【讨论】:

    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2016-10-20
    • 2016-10-25
    • 2020-12-27
    相关资源
    最近更新 更多