ReScript의 variant에 대한 정리
ReScript만의 유니크한 Variant!
-
Variant에 대해서는 여러번 나왔었는데요, 오늘은 한번 제대로 다뤄보고자 합니다.
라고 하고 공식문서 번역 -
Variant는 한마디로 한 타입에 대해서, 이거 아니면 저거의 형식을 취하게 해주는 자료 구조입니다.
type myResponse =
| Yes
| No
| PrettyMuch
let areYouCrushingIt = Yes
- 위의 표현이 JS로 변환되면
var areYouCrushingIt = /* Yes */0;
- 이렇게 됩니다. 즉, myResponse라는 타입은 Yes, No, PrettyMuch 세 타입중 하나를 가질 수 있고, areYouCrushingIt은 Yes 타입인 것이죠. 이까지는 이게 뭔가? 싶을 수 있습니다. 다음 예시에선 constructor argument를 가지는 variant가 나옵니다.
type account =
| None
| Instagram(string)
| Facebook(string, int)
let myAccount = Facebook("harold", 21)
let yourAccount = Instagram("Gunners")
-
이렇듯 argument가 바로 붙어서 나오는 variant 타입도 정의할 수 있다~ 하지만 Variant의 진정한 멋은 아래와 같은 곳에서 나옵니다.
-
예를 들어, 어떤 array가 존재하는데 그 array에 여러 타입을 담고 싶다면 어떻게 할까요? Java와 같은 언어에서라면 array를 조상 타입 혹은 그보다 훨씬 부모인 object 타입으로 정의한 후 polymorphism을 사용할 수도 있겠습니다만, ReScript에서는 Variant로 멋지게 해결할 수 있습니다. 아래처럼요.
type superType = FirstType(int)| SecondType(string)
type testArray = {
types: array<superType>
}
- testArray는 superType을 배열로 갖는 레코드입니다. 그럼 이제 다음과 같은 표현이 가능합니다.
let myMixedArray = {
types: [FirstType(1), SecondType("hello,world!")]
}
-
타입 추론에 의해 myMixedArray는 testArray로 분류되었고, 그 타입에 맞게 생성된 firsttype, secondtype들이 배열의 인자로 들어가 있는것이죠!
-
마지막으로 한가지 주의할 점을 언급하고 이만 시마이할게요!
type account =
| Facebook(string, int)
type account2 =
| Instagram((string, int))
- account는 string, int를 각각의 인자로 갖는 타입인 반면,
- account2는 (string, int) 라는 tuple을 하나의 인자로 갖는 타입입니다!
그럼 오늘은 여기까지~