Как заставить Flutter / Dart требовать типы?

Я привык полагаться на компилятор, чтобы отловить несовместимые типы ошибок. По умолчанию Dart предлагает это, только если я не забыл указать типы. Если я забуду включить типы в код, я не получу проверки типов.

Как мне заставить компиляторы Flutter / Dart вывести ошибку в указанных строках в следующем коде? Этот код отлично компилируется, несмотря на множество ошибок типов.

class Foo {
  String foo() {
    return "foo";
  }
}

class Bar {
  String bar() {
    return "bar";
  }
}

f() { // would like a missing return type error here (e.g. void)
  print("returns nothing");
}

void g(x) { // would like a missing parameter type error here...
  print(x.bar); // ...so this isn't a missing property at runtime
}

void h() {
  String a = f(); // would like this to error...
  print("$a");  // ...instead of this printing "null"
  g(Foo()); // would like this to error for incorrect parameter type
}

Если есть способ сделать это, как мне это сделать в Visual Studio Code и Intellij / Android Studio, а также в dart2js?


person Joe Lapp    schedule 23.08.2019    source источник
comment
@FernandoRocha: Почему вы не указываете типы? (законный вопрос) Я не понимаю. Вы спрашиваете, почему я случайно пропускаю типы? Я хочу, чтобы компилятор ловил мои ошибки.   -  person Joe Lapp    schedule 23.08.2019


Ответы (2)


Вы можете использовать файл analysis_options.yaml, чтобы сделать Dart строже.

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

Поместите этот файл в корень вашего проекта.

Это отключит ситуации, когда Dart откатится с помощью dynamic, и приведет к ошибке компиляции.

Он также отключает неявные апкасты, например:

Object a = 42;
String b = a; // unless `implicit-cast` is disabled, this is valid
person Rémi Rousselet    schedule 23.08.2019
comment
Потрясающие. Но у меня это не работает в VS Code. Я закинул это в pubspec.yaml, получил пакеты, перестроил и перезапустил, и никто не жаловался. - person Joe Lapp; 23.08.2019
comment
Как я уже сказал, это не внутри pubspec.yaml, а в другом файле: analysis_options.yaml - person Rémi Rousselet; 23.08.2019
comment
Превосходно. Это сработало. Большое спасибо! Извините за слишком быстрое чтение. - person Joe Lapp; 23.08.2019
comment
Реми, у тебя включены эти опции? Это хорошая практика программирования - выбирать более строгий стиль? - person atreeon; 24.08.2019

Другой способ - вызвать Dart Analyzer:

https://dart.dev/tools/dartanalyzer

Пример файла:

main() {
   print('May');
}

Результат:

PS C:\> dartanalyzer.bat --no-implicit-dynamic a.dart
Analyzing a.dart...
  error - Missing return type for 'main'. - a.dart:1:1 - implicit_dynamic_return
person Steven Penny    schedule 09.09.2020