在ReScript中如何使用variant选项为函数参数指定类型
ReScript 自定义变体的参数类型标注实现方法
报错原因
你写的~teacher: Teacher、~student: Person会触发语法错误,本质是混淆了ReScript里变体构造器和独立类型的区别:type person定义里的Teacher、Student是构造器,作用是给联合类型做模式匹配、构造对应的值,本身不是一个能独立引用的类型实体,自然不能直接写在参数后面当类型标注用。
正确实现思路
你当前的需求是让函数明确知道传入的是不带联合分支的纯教师数据、纯学生数据,最顺的实现方式是把每个变体携带的结构化记录抽成独立的具名类型:
- 先单独定义教师、学生各自的记录类型
- 原有的
person联合类型直接复用这些独立类型作为变体携带的值 - 函数参数直接用拆分后的独立类型做标注即可
对应的可运行完整代码如下:
type subject = Math | History // 拆分独立的具名类型 type teacherInfo = { firstName: string, subject: subject, } type studentInfo = { firstName: string, } // 原联合类型复用拆分后的独立类型 type person = | Teacher(teacherInfo) | Student(studentInfo) // 直接用独立类型做参数标注 let hasSameNameThanTeacher = ( ~teacher: teacherInfo, ~student: studentInfo, ) => { teacher.firstName == student.firstName }
场景补充
如果你的业务场景反过来,要求参数必须接收完整的person联合类型,只是想在函数内部区分传入的是教师还是学生,那就不需要拆分独立类型,直接给参数标person类型,在函数内部写模式匹配分支校验就行。但从你当前函数的逻辑来看,入参不需要接收不确定类型的联合值,拆分独立类型的写法既没有额外校验开销,类型约束也最严格,是最匹配你需求的方案。
内容的提问来源于stack exchange,提问作者JeromeBu
相关产品推荐
相关产品推荐

