const obj = { latitude: 11.5, longitude: 47.1 };
const result = obj.latitude * obj.longitute; // 보통은 이런 실수는 컴파일러가 잡아줘야 되는데
console.log(result) // NaN이라는 엉뚱한 값 출현!
=> 생산성이 향상되고 안전성도 높아진다. 개발 및 유지 보수 과정에서 시간과 노력을 절약할 수 있다.
1. 컴파일러, tsc
(1) 컴파일러
(2) tsc 명령어
tsc --init : tsconfig.json이 생성되는 명렁어tsc index.ts : index.ts를 컴파일(.ts는 Typescript파일 확장자)tsc src/*.ts : src 디렉토리 안에 있는 모든 Typescript파일을 컴파일tsc index.js --declaration --emitDeclarationOnly : @types 패키지를 위한 .d.ts파일 생성을 하는 명령어(Typescript로 작성된 모듈이 아닌 Javascript로 작성된 모듈에 타입 선언을 제공할 때 유용)2. tsconfig.json
(1) tsconfig.json
tsc --init 명령을 실행하면 생성되는 파일(2) tsconfig.json 주요 옵션
"outDir": "dist"로 설정하면 컴파일된 파일들이 dist 폴더에 저장됨compilerOptions - strict : 엄격한 타입 검사 옵션을 모두 활성화하는 옵션 (당연하게도, true로 설정하는 것 권장!!)개발환경에서는 꼭 true로 설정하는 것 권장!3. .d.ts
@types 라이브러리를 통해 외부 라이브러리에 대한 타입 정보를 제공 (.d.ts 파일이 많이 있음).d.ts 파일은 Typescript 타입 정의 파일 (Javascript 라이브러리에 대한 타입 정보를 제공).d.ts 파일로 Typescript 컴파일러는 외부 라이브러리의 함수 타입정보, 외부 라이브러리 클래스 타입정보, 외부 라이브러리 객체 타입정보, 외부 라이브러리의 타입추론을 할 수 있음 (타입추론이란, 타입이 명시되지 않았을 때 컴파일러가 알아서 해당 타입에 대해 추론을 하는 것)1. 기본 타입
(1) boolean
booleanenum이나 string(2) number
(3) string
(4) 배열
(5) 튜플(tuple)
const person: [string, number, boolean] = ['Spartan', 25, false];
const person2: [string, number, boolean] = [25, 'Spartan', false]; // 오류!
(6) enum
number 혹은 string 타입의 값만 할당 가능enum UserRole {
ADMIN = "ADMIN",
EDITOR = "EDITOR",
USER = "USER",
}
enum UserLevel {
NOT_OPERATOR, // 0
OPERATOR // 1
}
function checkPermission(userRole: UserRole, userLevel: UserLevel): void {
if (userLevel === UserLevel.NOT_OPERATOR) {
console.log('당신은 일반 사용자 레벨입니다');
} else {
console.log('당신은 운영자 레벨입니다');
}
if (userRole === UserRole.ADMIN) {
console.log("당신은 어드민입니다");
} else if (userRole === UserRole.EDITOR) {
console.log("당신은 에디터입니다");
} else {
console.log("당신은 사용자입니다");
}
}
const userRole: UserRole = UserRole.EDITOR;
const userLevel: UserLevel = UserLevel.NOT_OPERATOR;
checkPermission(userRole, userLevel);
2. const, readonly
불변성을 보장(1) let
(2) const
(3) readonly
class Person {
readonly name: string;
readonly age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const person = new Person('Tom', 30);
console.log(person.name); // 출력: 'Tom'
console.log(person.age); // 출력: 30
person.name = 'Jane'; // 에러: 'name'은 readonly 속성이므로 다시 할당할 수 없음
person.age = 25; // 에러: 'age'은 readonly 속성이므로 다시 할당할 수 없음
=> readonly를 const로 치환?
안됨!! const 키워드는 일반 변수를 상수화 할 때 사용하는 것!
3. any, unknown, union
(1) any
(2) unknown
let unknownValue: unknown = '나는 문자열입니다!';
let stringValue: string;
if (typeof unknownValue === 'string') {
stringValue = unknownValue;
console.log('unknownValue는 문자열이네요');
} else {
console.log('unknownValue는 문자열이 아니었습니다');
}
(3) union
| 연산자를 사용하여 여러 타입을 결합하여 표현type StringOrNumber = string | number; // 원한다면 | boolean 이런식으로 타입 추가가 가능!
function processValue(value: StringOrNumber) {
if (typeof value === 'string') {
// value는 여기서 string 타입으로 간주됨
console.log('String value:', value);
} else if (typeof value === 'number') {
// value는 여기서 number 타입으로 간주됨
console.log('Number value:', value);
}
}
processValue('Hello');
processValue(42);
=> Typescript를 쓰면서 여러 타입을 하나의 변수로 해결하겠다는 생각은 가급적 지양!