В веб-проектах dart предупреждения о типах и ссылках не должны быть ошибками?

#dart

#dart

Вопрос:

В dart при разработке веб-приложения, если я вызываю метод с неправильным количеством аргументов, редактор отображает предупреждающее сообщение, однако компиляция javascript выполняется успешно, и ошибка возникает только во время выполнения. Это также имеет место, например, если я ссылаюсь на несуществующую переменную или передаю аргумент метода неправильного типа.

Я спрашиваю, если редактор уже знает, что что-то не сработает, почему компиляция прошла успешно? Почему у нас есть типы, если они не проверяются во время компиляции? Я предполагаю, что у такого поведения есть причина, но я нигде не смог найти ее объяснения.

Ответ №1:

В Dart многие ошибки программирования являются предупреждениями. Это по двум причинам.

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

Другая причина заключается в том, что предупреждения представляют собой только статическую проверку типов, которая не знает всего о вашей программе, возможно, ваша программа будет работать, это просто невозможно определить анализатору.

Пример:

 class C {
  int foo(int x) => x;
}
class D implements C {
  num foo(num x, [num defaultValue]) => x == null ? defaultValue : x;
}
void bar(C c) => print(c.foo(4.1, 42));  // Static warning: wrong argument count, bad type.
main() { bar(new D()); }  // Program runs fine.
  

Если ваша программа работает, ее не должен останавливать педантичный анализатор, который знает только половину правды. Вы все равно должны посмотреть на предупреждения и подумать, есть ли о чем беспокоиться, но вполне нормально решить, что вы на самом деле знаете лучше, чем компилятор.

Комментарии:

1. хм, это странный подход для разработчиков Java 🙂 Кроме того, в вашем примере панель методов просто неправильная. Программа действительно работает нормально, но объявление метода ‘bar’ неверно из-за семантики OO.

Ответ №2:

Нет этапа компиляции. То, что вы видите, — это предупреждение, основанное на типе. Например:

В этом коде будет предупреждение:

 void main() {
  var foo = "";
  foo.baz(); 
}
  

но это не будет:

 void main() {
  var foo;
  foo.baz(); 
}
  

поскольку анализатор кода не может вычесть тип foo

Комментарии:

1. хм, я думаю, вот объяснение, которое я искал dartlang.org/articles/why-dart-types