타입을 활용하면 해당 경계로 유입되는 값의 유형을 실행 전에 검사할 수 있습니다. 초기값으로 타입을 명확히 추론할 수 있는 지역 변수는 대개 타입 표기를 생략해도 됩니다. 입력과 반환값, 혹은 도메인의 주요 선택지를 명시해야 할 때 타입을 표기하세요.
하나의 프로그램에서 시작하기
다음 코드를 types.tpz로 저장하세요.
type 단계 = "draft" | "ready"
function 설명(단계값: 단계, 검사수: int) -> string {
"{단계값} after {검사수} checks"
}
let 검사수 = 3
let 현재: 단계 = "ready"
let 표시함수: (단계, int) -> string = 설명
print(표시함수(현재, 검사수))먼저 타입 경계를 검사하세요. 그다음 실행하세요.
topaz check types.tpz
topaz run types.tpz실행 결과는 다음과 같습니다.
ready after 3 checks결과에서 타입 읽어 내기
검사수에는 타입 표기가 생략되어 있습니다. 초기값이 정수이므로 토파즈가 int로 추론합니다. 반면 현재에는 타입을 명시했습니다. 이는 임의의 string 대신 단계 타입만 받겠다는 의도를 나타냅니다.
단계는 "draft" | "ready" 리터럴 유니온에 지정한 투명한 별칭입니다. 정의된 두 값 중 하나만 허용하며 다른 문자열은 거부합니다. 타입 별칭은 이러한 선택지에 직관적인 이름을 부여하지만, 별도의 런타임 정체성을 생성하지는 않습니다.
표시함수에는 함수 타입을 사용했습니다. (단계, int) -> string은 단계와 int를 받아 string을 반환하는 함수 타입을 의미합니다. 명명된 함수 설명이 이 서명과 일치하므로 바인딩에 할당하여 호출할 수 있습니다.
기본 타입 이름은 소문자로 표기합니다. 여기에는 int·float·bool·string 및 유닛 타입 ()가 포함됩니다. 자주 사용하는 컨테이너는 Array<T>·Map<K, V>·Set<T>와 같은 생성자로 표기합니다. 예측 가능한 값의 부재는 Option<T>로 표현하며, 복구 가능한 실패는 Result<T, E>로 표현합니다.
의도에 맞는 형태 고르기
| 필요한 것 | 권장 형태 | 이유 |
|---|---|---|
| 타입이 분명한 지역 값 | 타입 추론 | 초기값만으로도 타입이 명확히 드러납니다. |
| 공개 입력·결과 또는 중요한 지역 경계 | 타입 표기 | 검사기와 독자가 의도한 계약을 바로 알아볼 수 있습니다. |
| 정해진 여러 대안 가운데 하나 | 유니온 또는 리터럴 유니온 별칭 | 허용되는 대안이 코드 표현에 그대로 반영됩니다. |
| 나중에 호출할 수 있는 값 | (int) -> bool 같은 함수 타입 | 매개변수와 반환 타입이 함수 값에 유지됩니다. |
| 도메인 정체성, 필드, 이름 붙은 경우 | record, enum, newtype | 내부 구조가 유사하더라도 서로 다른 타입으로 남습니다. |
type 별칭은 구문의 가독성을 높여 주지만, 기존 타입과 구별되는 별도의 정체성을 형성하지는 않습니다. 구조가 유사한 두 값을 혼용하는 일을 방지해야 한다면 명목 데이터를 선택하세요. 레코드와 명목 데이터에서 record·enum·newtype의 생성과 패턴을 비교할 수 있습니다.
빈 값에는 문맥 제공하기
일부 값은 그 자체만으로 타입을 온전히 나타내지 못합니다. 빈 배열에는 원소 타입이 지정되지 않으며, None 단독으로는 부재한 값의 타입을 특정할 수 없습니다. 이러한 경우에는 타입 표기·함수 매개변수·반환 타입 선언 등 주변 문맥을 제공하세요.
let 이름들: Array<string> = []
let 선택값: Option<int> = None위 코드는 올바른 표기 형식만을 나타내고자 텍스트로 기술되었습니다. 본 문서에서 실제로 동작을 검증하는 코드는 상단의 실행 예제입니다.
흔한 실수: 타깃 언어의 타입 표기 가져오기
토파즈의 컬렉션 타입은 Array<T>·Map<K, V>·Set<T> 형태로 표기합니다. 함수 타입은 매개변수 타입을 괄호로 감싼 뒤 -> 구분자와 반환 타입을 기술합니다. 이 표기를 일관되게 유지해야 검사기와 코드 생성 대상이 동일한 소스 계약을 공유합니다.
정확한 한계
int와float사이의 암묵적 타입 변환은 지원하지 않습니다.- 제네릭 타입 매개변수는 무공변입니다. 구조적 유사성만으로 서로 다른 타입 인수가 호환되지는 않습니다.
- 제네릭 제약 조건은 명명된 함수의 타입 매개변수에만 적용됩니다. 허용되는 1계층 형태는 함수와 제네릭에서 설명합니다.
- 재귀 타입 별칭, 분산 표기, 고위 다형성, 확장 리플렉션은 지원하지 않습니다.
- 문맥을 제공하더라도 타입 매개변수가 결정되지 않는 빈 제네릭 값이 존재합니다. 이러한 값은 런타임에 추론하지 않고 정적 오류로 거부합니다.
타입 추론·타입 표기·가변성 개념이 낯설다면 값과 함수 문서를 다시 확인하세요. 값의 부재와 실패를 구분하려면 Null·Option·결과·fault 문서로 이어가세요.