Topaz 타입 시스템은 기본 타입, 리터럴과 유니온, 구조적 레코드, 함수 타입, 표준 제네릭 타입, 명목 선언을 암묵적 변환 없이 결합합니다.
정책
기본 타입은 int, float, string, bool, ()입니다. 표준 제네릭 타입은 Array<T>, Map<K,V>, Set<T>, Option<T>, Result<T,E>입니다. type은 투명한 별칭을 만들고, record, enum, newtype은 서로 다른 정체성을 만듭니다. 함수 타입은 (T) -> U, 마지막 가변 인수는 ...T로 적습니다. null은 해당 값을 포함한 유니온 타입으로 표현합니다.
명시된 동작
리터럴 타입은 하나의 값만 허용하고, 유니온은 구성 타입 중 하나를 허용합니다. 타입 매개변수는 무공변입니다. enum, record, newtype의 생성, 패턴, 비교, JSON 형태, 기본값은 각 선언의 규칙을 따릅니다. None, [] 같은 빈 값은 주변 문맥에서 타입을 결정합니다.
제약과 명시적 거부
약식 컬렉션 타입 [T], function(T) -> U, 마지막이 아닌 가변 인수, 재귀 타입 별칭, 풀리지 않는 빈 제네릭 값은 거부됩니다. int와 float는 자동 변환되지 않습니다. 제네릭 제약은 이름 있는 함수 선언에서만 사용할 수 있습니다.
유예 경계
고위 다형성, 공변성 표기, 재귀 타입 별칭, 제네릭 람다, 넓은 반사 API는 아직 포함되지 않습니다. 호출부의 명시적 타입 인수는 허용된 1계층 제네릭 함수에 모든 타입 인수를 제공할 때만 사용할 수 있습니다.
예제
type TrafficLight = "red" | "yellow" | "green"
type Pair<T> = { first: T, second: T }
function next(light: TrafficLight) -> TrafficLight {
match light {
case "red" => "green"
case "green" => "yellow"
case "yellow" => "red"
}
}
let bounds: Pair<int> = { first: 0, second: 100 }