#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") ), ]); }