在 Dart 中的函数参数中键入列表

Typing lists in function arguments in Dart

Dart 允许我们为函数键入参数真是太好了:

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

但是如果参数应该是所述类型的列表怎么办。即:

void createPeople(List<?> peopleConfigs) {
  /* Create multiple */
}

在此处输入 peopleConfigs 的最佳方式是什么?传递参数时,像代码 hint/completion 这样的工具是否仍然有效?

我知道我可以只使用 List<Map<String, dynamic>> 但我想知道是否有一种类型更安全的方法可以在使用不应该使用的键时抛出编译时错误。

我来自 TypeScript,这非常简单:

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

如果您希望 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(List<PersonConfig> peopleConfigs) {
  //some logic
}

void main() {
  createPeople(<PersonConfig>[
    create1, //<--- ok
    (String name, int age, Function sayHey) {}, //<--- ok
    create2, // <--- error
  ]);
}

如果您希望 peopleConfigs 持有 class 个实例:

class PersonConfig {
  final String? name;
  final int? age;
  final Function? sayHey;

  PersonConfig({
    this.name,
    this.age,
    this.sayHey,
  });
}

void createPeople(List<PersonConfig> peopleConfigs) {
  //some logic
}

void main() {
  createPeople(<PersonConfig>[
    PersonConfig(name: "", age: 0, sayHey: () => "hi"),
  ]);
}

您可以创建一个类型,然后您可以将所述类型的列表定义为参数:

class Parameters {
  final String name;
  final int age;
  final Function sayHey;
  
  Parameters({required this.name, required this.age, required this.sayHey});
}

void someFunction(List<Parameters> parameters) {
  print(parameters);
}

void main() {
  someFunction([
    Parameters(name: "Joe", age: 21, sayHey: () => print("hi") ),
    Parameters(name: "Suzi", age: 24, sayHey: () => print("hello") ),
  ]);
}