Typescript Handbook / Developer's Record 를 참고했습니다.
String, Number, Boolean
let myName: string = "윤병인"
let age: number = 25
let hasGirlFriend: boolean = false
Array
let list1: number[] = [1, 2, 3]
let list2: Array<number> = [1, 2, 3]
let list3: Array<string> = ["A", "B", "C"]
for...in
var arr = ["A", "B", "C"]
for(var key in arr) {
console.log(arr[key]) // A, B, C 출력
}
for...of
var arr = ["A", "B", "C"]
for(var val of arr) {
console.log(val) // A, B, C 출력
}
Tuple
let x: [string, number]
x = ["Hello", 100]
// ERROR
x = ["Hello", 100, 500] // Type '[string, number, number]' is not assignable to type '[string, number]'.
Enum
enum은 특수한 숫자 문제에 대한 해결책을 제공한다. 특정 숫자와 사람이 읽기 쉬운 이름을 연결할때 유용하다.
enum Color {
Red,
Green,
Blue
}
let c: Color = Color.Green; // Color["Green"] 도 가능하다.
console.log(c); // 1
Red를 3으로 하면 Green, Blue는 자동으로 4, 5가 된다.
enum Color {
Red = 3,
Green,
Blue
}
let c: Color = Color.Green;
console.log(c); // 4
하나하나 값을 설정할 수 도 있다.
enum Color {
Red = 3,
Green = 100,
Blue = 200
}
let c: Color = Color.Green;
console.log(c); // 100
반대로 Red, Green, Blue를 얻을수도 있다.
enum Color {
Red = 3,
Green = 100,
Blue = 200
}
let colorName: string = Color[100];
console.log(colorName); // Green
열거형을 상수로 만드는것도 가능하다.
const enum Color {
Red,
Green,
Blue
}
console.log(Color.Red)
console.log(Color["Red"])
하지만, console.log(Color[0])
이렇게 index로 접근하는건 안된다. 보통의 enum
은 컴파일러가 클로저로 변환해서 index로도, key로도 접근이 가능했지만, 이게 성능상 별로 좋지 않아서 const enum
이 나오게 된건데, const enum
은 컴파일하면서 모두 그냥 숫자로 바꿔버린다. 그래서 위 코드를 컴파일하면 아래와 같이 나온다.
"use strict";
console.log(0 /* Red */);
console.log(0 /* "Red" */);
Any
let notSure: any = 4
notSure = "뭐 어때"
notSure = true
notSure = [1, '2', false, new Object()]
notSure.testFunction();
Void, Null, Undefined
Void
리턴 값이 없을때 Void를 사용한다
function doNothing1() { }
function doNothing2(): void { }
function doNothing3(): void {
return undefined;
}
null을 넣을 수는 없다.
function doNothing4(): void {
return null; // ERROR : Type 'null' is not assignable to type 'void'.
}
Null
let a: null = null
a = undefined // ERROR : Type 'undefined' is not assignable to type 'null'.
function sayHi(message: string | null) {
console.log(message);
}
sayHi() // ERROR : An argument for 'message' was not provided.
Undefined
let iDontKnow: undefined = undefined;
// optional property는 기본적으로 undefined이다
function sayHi(message?: string) {
console.log(message);
}
sayHi(); // 인자값이 없어도 호출은 된다
기본적으로는 null
과 undefined
모두 number
에도 넣을 수 있고, string
에도 넣을 수 있는 subtype이다. 그러나 --strictNullChecks
flag를 사용할때 null
과 undefined
는 any
타입에만 넣을 수 있다. 그래서 어떤 함수가 뭘 리턴할지 모를때 union
을 써서 리턴타입을 이렇게 string | null | undefined
해주는게 좋다.
Never
function error(message: string): never {
throw new Error(message);
console.log("END !!")
}
function infiniteLoop(): never {
while(true) {
console.log("도르마무 거래를 하러왔다!");
}
// 여기는 절대(never) 읽히지 않는다.
}
어떤 함수가 error를 떤져서 함수가 끝까지 실행될일이 없거나, 코드안에 무한루프가 있어서 끝까지 실행될 일이 없을때 그 리턴값을 never로 지정한다.
Object
let obj: Object = {
apple: "사과",
banana: "바나나",
year: 2019
}
Type Assertions
let someValue: any = "This is string"
let strLength: number = (<string>someValue).length;
strLength = (someValue as string).length
let item1 = <any>{id: 1, name: "yoon"}
item1 = {id : 2} // name property가 없지만 문제 없음
다만, java와 같은 다른 언어의 형변환과는 다르다. 메모리가 다르게 잡힌다던지 하는게 아니라, 그냥 컴파일 할때만 "~~형으로 바꿔쓰겠다" 라고 표시만 해주는거다.
함수
인자 타입과 반환 타입
function addNumber(a: number, b: number) : number {
return a + b
}
let result = addNumber(10, 20)
console.log(`result is ${result}`) // result is 30
익명함수
let addNumber = function(a: number, b: number) : number {
return a + b
}
let result = addNumber(10, 20)
console.log(`result is ${result}`)