/** 추상적으로 선언 */
interface Point {
type: 'Point';
coordinates: number[]; // 추상적이다! [1], [1,2], [1,2,3,4, ...] 가능
}
/** 좀 더 명확하게 튜플 타입으로 선언 */
type GeoPosition = [number, number]; // 위도와 경도 명시
interface Point {
type: 'Point';
coordinates: GeoPosition; // 구체적이지만 또 다른 정보(예-고도)를 고려하지 않았다.
}
🔍 튜플 타입이란? 길이와 각 요소마다 타입이 고정된 배열을 의미한다.
type Expression1 = any;
type Expression2 = number | string | any[];
const tests: Expression2[] = [
10,
"red",
true, // 오류!! boolean은 Expression2에 해당되지 않음.
["+", 10, 5],
["case", [">", 20, 10], "red", "blue", "green"], // 오류가 발생하지 않음. (개수 초과)
["**", 2, 31], // 오류가 발생하지 않음. ("**"는 함수가 아님.)
["rgb", 255, 128, 64],
["rgb", 255, 0, 127, 0] // 오류가 발생하지 않음. (개수 초과)
];
type FnName = '+' | '-' | '*' | '/' | '>' | '<' | 'case' | 'rgb';
type CallExpression = [FnName, ...any[]];
type Expression3 = number | string | CallExpression;
const tests: Expression3[] = [
10,
"red",
true, // 오류!! boolean은 Expression3에 해당되지 않음.
["+", 10, 5],
["case", [">", 20, 10], "red", "blue", "green"], // 오류가 발생하지 않음. (개수 초과)
["**", 2, 31], // 오류!! "**"는 FnName에 해당되지 않음.
["rgb", 255, 128, 64],
["rgb", 255, 0, 127, 0] // 오류가 발생하지 않음. (개수 초과)
];
type Expression4 = number | string | CasllExpression;
type CallExpression = MathCall | CaseCall | RGBCall;
interface MathCall {
0: '+' | '-' | '*' | '/' | '>' | '<';
1: Expression4;
2: Expression4;
length: 3;
}
interface CaseCall {
0: 'case'
1: Expression4;
2: Expression4;
3: Expression4;
length: 4 | 6 | 8 | 10 | 12 | 14 | 16
}
interface RGBCall {
0: 'rgb';
1: Expression4;
2: Expression4;
3: Expression4;
length: 4;
}
const tests: Expression4[] = [
10,
"red",
true, // 오류!! boolean은 Expression3에 해당되지 않음.
["+", 10, 5],
["case", [">", 20, 10], "red", "blue", "green"], // 오류!! 개수가 초과되었음.
["**", 2, 31], // 오류!! "**"는 FnName에 해당되지 않음.
["rgb", 255, 128, 64],
["rgb", 255, 0, 127, 0] // 오류가 발생하지 않음. (개수 초과)
];
위의 예시대로 입력했을 때 실제로 생기는 에러 메시지들