Привет
Typescript имеет прекрасную концепцию объединения различных типов для заданного атрибута интерфейса/переменной/параметра и т.д.
Rescript более строг, вы можете иметь только один тип для данного атрибута/переменной/параметра. Поэтому в этом посте я хотел бы показать, как создать тип объединения в Rescript, который будет принят и typescript.
Допустим, у нас есть тип prop, который принимает строку | число.
interface Props {
...otherProps,
badgeContent: string | number
}
На стороне rescript нам нужно придумать модуль, который будет обертывать число и строку следующим образом
@unboxed
type rec t = Any('a): t
module String_or_number: {
type t
type case =
| Number(float)
| String(string)
let number: float => t
let string: string => t
let classify: t => case
} = {
@unboxed
type rec t = Any('a): t
type case =
| Number(float)
| String(string)
let number = (v: float) => Any(v)
let string = (v: string) => Any(v)
let classify = (Any(v): t): case =>
if Js.typeof(v) == "number" {
Number((Obj.magic(v): float))
} else {
String((Obj.magic(v): string))
}
}
Использование типа String_or_number
module Badge = {
@genType.import("./Badge") @react.component
external make: (
...,
~badgeContent: String_or_number.t=?,
) => React.element = "Badge"
Если мы хотим передать число в badgeContent, то используем его следующим образом
<Badge badgeContent=String_or_number.number(1.0) />