Ввод списков в аргументах функций в Dart

#dart #types

Вопрос:

Здорово, что Dart позволяет нам вводить аргументы для функций:

 void createPerson(String name, int age, sayHey: Function) {  /* Create */ }  

Но что, если аргумент должен быть списком указанного типа. Т. е.:

 void createPeople(Listlt;?gt; peopleConfigs) {  /* Create multiple */ }  

Как лучше всего печатать peopleConfigs здесь? И будут ли такие инструменты, как подсказка/завершение кода, по-прежнему работать при передаче аргументов?

Я знаю, что могу просто использовать Listlt;Maplt;String, dynamicgt;gt; , но мне интересно, есть ли более типобезопасный способ, который приводил бы к ошибкам во время компиляции, если бы использовались ключи, которых не должно быть.

Я исхожу из машинописного текста, где это довольно прямолинейно:

 createPeople(peopleConfigs: {name: string, age: number, sayHey: () =gt; void}[]): void {  /* Create multiple */ }  

Ответ №1:

Если вы хотите, чтобы у вас peopleConfigs были некоторые функции с определенной сигнатурой типа:

Вы можете использовать typedef для этого:

 typedef PersonConfig = void Function(  String name,  int age,  Function sayHey, );  //ok function void create1(String name, int age, Function sayHey) {}  //not ok function void create2(String name, double age, Function sayHey) {}  void createPeople(Listlt;PersonConfiggt; peopleConfigs) {  //some logic }  void main() {  createPeople(lt;PersonConfiggt;[  create1, //lt;--- ok  (String name, int age, Function sayHey) {}, //lt;--- ok  create2, // lt;--- error  ]); }   

Если вы хотите, чтобы ваши peopleConfigs экземпляры классов хранились:

 class PersonConfig {  final String? name;  final int? age;  final Function? sayHey;   PersonConfig({  this.name,  this.age,  this.sayHey,  }); }  void createPeople(Listlt;PersonConfiggt; peopleConfigs) {  //some logic }  void main() {  createPeople(lt;PersonConfiggt;[  PersonConfig(name: "", age: 0, sayHey: () =gt; "hi"),  ]); }  

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

1. Я не уверен, что понимаю это. Похоже, что список содержит функции, а не объекты/карты?

2. Я обновил свой ответ. Первый пример посвящен использованию подписи типа функции в списках. Второй пример посвящен созданию типизированного объекта. Может быть, я не понял вашего вопроса… @шеннан

3. Ладно, я понял. Таким образом, вы бы рекомендовали создать список экземпляров классов в качестве аргументов для выполнения этого требования? Я предполагаю, что, исходя из JavaScript, я привык к тому, что мне не нужно добавлять шаблон создания экземпляра класса, поскольку вы можете свободно передавать объектные литералы в качестве аргументов функциям; и TypeScript добавляет дополнительную проверку типов для этих объектов. Но если это лучший способ сделать это в Dart, то так тому и быть!

4. Да, в Dart для этого нужно объявить класс…

5. Спасибо за помощь.

Ответ №2:

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

 class Parameters {  final String name;  final int age;  final Function sayHey;    Parameters({required this.name, required this.age, required this.sayHey}); }  void someFunction(Listlt;Parametersgt; parameters) {  print(parameters); }  void main() {  someFunction([  Parameters(name: "Joe", age: 21, sayHey: () =gt; print("hi") ),  Parameters(name: "Suzi", age: 24, sayHey: () =gt; print("hello") ),  ]); }