首页 > 解决方案 > Dart 是否有相当于 TypeScript 的 --noImplicitAny,强制静态类型,除非明确禁用?

问题描述

我开始掌握 Flutter 和 Dart 语言,但偶尔会犯一些愚蠢的错误,因为语言允许我这样做。在type inference 的文档中,它说:

分析器可以推断字段、方法、局部变量和大多数通用类型参数的类型。当分析器没有足够的信息来推断特定类型时,它会使用该dynamic类型。

这似乎发生了相当多的事情,并且无法查看分析器是什么以及无法推断出什么。例如:

void doThings(List<int> integers) {
  print(integers);
}

main() {
  doThings([1, 2, 3].map((i) => i + 1));
}

IDE(IntelliJ)或编译期间没有警告,但在运行时我们会变得很丑TypeError: Instance of 'MappedListIterable<int, int>': type 'MappedListIterable<int, int>' is not a subtype of type 'List<int>',因为我需要一个.toList()调用。

为了在编译时而不是运行时捕获类似的错误,TypeScript 有一个选项--noImplicitAny可以将任何不可推断的类型变成错误,而不是默默地替换变体类型(dynamic在 Dart 中,any在 TypeScript 中)。

有没有办法让 Dart 编译器也有帮助?

标签: flutterdart

解决方案


您可以自定义静态分析器。您需要添加analysis_options.yaml到您的根目录。

要禁止隐式类型,请使用以下命令:

analyzer:
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false

更多信息:https ://dart.dev/guides/language/analysis-options


推荐阅读