// 식별자(값): 타입
value: type
// ex
const answer: number = 42;
const isTrue: boolean = true;
점진적 타이핑
- 점진적으로 타입 안정성을 키워나가는 것을 허용하는 타입 시스템
- 타입스크립트 컴파일러는 타입 시스템의 엄격한 정도를 위한 다양한 옵션을 제공
- 타입스크립트는 타입 추론을 지원하나, 의존성을 줄이고 명시적으로 타입 정보를 적어주는 것이 좋다.
null
/ undefined
, void
이외의 타입을 할당하면 에러 발생let nullVaule: null = null;
nullValue = 123; // Error 발생
let bool: any = true;
bool = 3;
bool = 'hello';
null
, undefined
만을 값으로 가질 수 있는 타입throw
하는 함수의 반환 타입으로 설정type
[], Array<type
>const nameAndHeigth: [string, number] = ['홍길동', 170];
// 타입 정의와 다른 갯수의 원소를 갖는 배열을 할당할 경우, 에러 발생
// TypeScript 2.7 부터 적용
const invalidNameAndHeigth: [string, number] = ['홍길동', 170, 42]; // Error
{}
)를 이용해 표현속성 : 속성의 타입
으로 표현,
), 세미콜론(;
) 모두 사용 가능const user: { name: string; height: number; } = { name: '홍길동', height: 170 };
?
)를 붙여 선택적인 속성을 표현할 수 있음const userWithUnknownHeight: { name: string; height?: number; } = { name: '홍길동'};
readonly
키워드를 붙여 속성의 재할당을 막을 수 있다const
변수와 비슷하게 동작const user: {
readonly name: string;
height: number;
} = { name: '홍길동', height: 170 };
user.name = '동길홍'; // Error
type 타입 별칭 = 실제 타입;
type UUID = string;
type Height = number;
function getUser(uuid: UUID) {
// ...
}
getUser(7); // Error
function sum(a: number, b: number): number {
return a + b;
}
매개변수명: 타입 = 기본값
?
)를 붙여 명시function hello(name: string = 'stranger', age?: number): void {
console.log(name); // kim
if(age) {
console.log(age); // 20
}
}
hello('kim');
(...매개변수) => 반환 타입
const sum: (a: number, b: number) => number (a, b) => (a + b);
function double(str: string): string;
function double(num: number): number;
function double(arg) {
if(typeof arg === 'string') {
return `${arg}${arg}`;
} else if(typeof arg === 'number') {
return arg*2;
}
}
this
값은 실행되는 시점에 결정this
타입 명시하기this
추가interface HTMLElement {
tagName: string;
/* ... */
}
interface Handler {
(this: HTMLElement, event: Event, callback: () => void): void;
}
let cb: any;
// 실제 함수 매개변수에는 this가 나타나지 않음
const onClick: Handler = function(event, cb) {
// this는 HTMLElement 타입
console.log(this.tagName);
cb();
}
<
타입변수>
function getFirstElem<T>(arr: T[]): T {
// ...
}
const language = getFirstElem<string>(['hi', 'hello']);
|
)로 이어서 사용type Whatever = number | string | boolean;
// 여러 줄에 걸쳐 정의 가능
type Whatever
= number
| string
| boolean;
&
)로 이어서 사용type Awesome = Programmer & BeerLover & CatLover;
// 여러 줄에 걸쳐 정의 가능
type Awesome
= Programmer
& BeerLover
& CatLover;
- 열거형 사용을 웬만해서 추천하지 않는 듯 하다...
멤버
1. 상수 멤버: 컴파일 타입에 알 수 있는 상수값으로 초기화되어있는 멤버
2. 계산된 멤버: 실제로 코드를 실행시켜봐야 값을 알 수 있는 멤버
- 계산된 멤버 뒤에 오는 멤버는 열거형 정의 시 반드시 초기화되어야 함.
0
부터 순차적으로 증가하는 값을 가짐enum Direction {
East,
West,
South,
North
}
const south: Direction = Direction.south;
console.log(south); // 2
// 중간에 초기화되지 않은 멤버가 있을 경우, 이전 멤버 값으로 부터 순차적으로 증가됨
enum InitializedDirection2 {
East = 3,
West /* 4 */,
South = 7,
North /* 8 */
}