Dart函数如何对指定类型的列表参数做类型安全标注?
方案1:Dart 3+ 推荐使用记录(Record)类型
这是和你TypeScript示例体验最接近的实现,不需要额外定义类,就能实现编译期的类型校验、完整的IDE补全提示。
首先定义类型别名简化写法:
// 和TS的type PersonConfig = {name: string, age: number, sayHey: ()=>void}逻辑完全一致 typedef PersonConfig = ({String name, int age, void Function() sayHey}); // 函数参数标注 void createPeopleList(List<PersonConfig> peopleConfigs) { // 内部访问字段时也有完整类型提示,写错字段直接触发编译错误 for (final cfg in peopleConfigs) { createPerson(cfg.name, cfg.age, cfg.sayHey); } }
调用示例:
createPeopleList([ // 传参时IDE会自动补全所有必填字段,类型不对/少字段/多写不存在的字段都会直接标红 (name: "张三", age: 20, sayHey: () => print("hi")), (name: "李四", age: 22, sayHey: () => print("hello")), ]);
方案2:Dart 2.x 版本使用自定义类实现
如果你的项目还没升级到Dart 3,可以通过显式定义配置类的方式实现同等的类型安全效果:
class PersonConfig { final String name; final int age; final void Function() sayHey; // 要求所有参数必填 PersonConfig({ required this.name, required this.age, required this.sayHey, }); } // 函数参数标注 void createPeopleList(List<PersonConfig> peopleConfigs) { for (final cfg in peopleConfigs) { createPerson(cfg.name, cfg.age, cfg.sayHey); } }
调用示例:
createPeopleList([ PersonConfig( name: "张三", age: 20, sayHey: () => print("hi"), ), PersonConfig( name: "李四", age: 22, sayHey: () => print("hello"), ), ]);
说明
- 不推荐使用
List<Map<String, dynamic>>的写法:这种写法没有编译期类型校验,写错Key、值类型不对都不会在编码阶段报错,只有运行时才会触发问题,也没有IDE的字段补全提示。 - 两种方案都完全支持IDE的代码提示、补全、错误检查能力:使用了不存在的键、类型不匹配都会在编译前就被IDE标红提示,和你在TypeScript中的体验一致。
内容的提问来源于stack exchange,提问作者shennan
相关产品推荐
相关产品推荐

