TypeScript
= Static Types(개발하는 중간에 타입을 체크)
JavaScript
= Dynamic Types(개발X, runtime 돌입 후 타입체크)
// JavaScript
function add(n1, n2) {
// runtime상에서 구분 후 그런 일이 있으면 Error를 출력해라.
if (typeof n1 !== 'number' || typeof n2 !== 'number') {
throw new Error('Incorrect input');
}
return n1 + n2;
}
const result = add(39, 28);
// TypeScript
// TypeScript는 매개변수에 지정을 하고 시작하니까
// 타입이 정확하게 들어갔는지 개발 중에 확인가능
function add(n1: number, n2: number) {
return n1 + n2;
}
const result = add(39, 28);
true;
'hello';
3.14;
null;
undefined
new Boolean(false); // typeof new Boolean(false) : 'object'
new String('world'); // typeof new String('world') : 'object'
new Number(42); // typeof new Number(42) : 'object'
let isDone: boolean = false;
isDone = true;
console.log(typeof isDone); //'boolean'
let isOk: Boolean = true;
// let isNotOk: boolean = new Boolean(true);
let decimal: number = 6; // 10진수 리터럴
let hex: number = 0xf00d; // 16진수 리터럴
let binary: number = 0b1010; // 2진수 리터럴
let octal: number = 0o744; // 8진수 리터럴
let notANumber: number = NaN;
let bunderscoreNum: number = 1_000_000;
string
형식을 사용한다.Template String
${expr}
와 같은 형태로 사용한다.let fullName: string = `Bob Bobbington`;
let age: number = 38;
let sentence: string = `Hello, my name is ${fullName}.
I'll be ${ age + 1 } Years old next month.`;
// Template String을 사용하지 않을 경우
let sentence: string = "Hello, my name is" + fullName + ".\n\n" +
"I'll be" + (age + 1) + "Years old next month.";
ECMAScript 2015의 Symbol입니다.
new Symbol로 사용할 수 없습니다.
Symbol을 함수로 사용해서 Symbol타입을 만들어낼 수 있습니다.
프리미티브 타입의 값을 담아서 사용한다.
고유하고 수정불가능한 값으로 만들어준다.
그래서 주로 접근을 제어하는데 쓰는 경우가 많다.
함수로 사용할 때는 Symbol(대문자), 타입으로 사용할 때는 symbol(소문자)
--strictNullChecks
사용하면 undefined와 null은 void나 자기 자신들에게만 할당할 수 있다.// 이 변수들에 할당할 수 있는 것들은 거의 없다.
let u: undefined = undefined;
let n: null = null;
const parson1 = {name: "Winnie", age: 28};
// parson1 is not "object" type
// parson1 is "{name: string, age: number}" type
// create by Object.create
const parson2 = Object.create({name: "Winnie", age: 28});
let list: (number | string)[] = [1, 2, 3, "4"];
let list: Array<number> = [1, 2, 3];
let x: [string, number];
x = ["hello", 28];
// string, number 위치가 바뀌어서 에러
x = [10, "Winnie"];
const person: [string, number] = ["Winnie", 28];
// 튜플은 2개인데 3개를 넣어서 에러
const [first, second, third] = person;
function returnAny(message: any): any {
console.log(message);
}
const any1 = returnAny('리턴은 아무거나');
any1.toString();
let looselyTyped: any = {};
// d, looselyTyped, a, b, c, d 모두 any이다.
let d = looselyTyped.a.b.c.d;
declare const maybe: unknown;
// maybe는 unknown이므로 아래 선언은 에러
const aNumber: number = maybe;
if (maybe === true ) {
const aBoolean: boolean = maybe;
// 이 안에서 maybe는 true이므로 아래 선언은 에러
const aString: string = maybe;
}
if (typeof maybe === 'string') {
const aString: string = maybe;
// 이 안에서 maybe는 string이므로 아래 선언은 에러
const aBoolean: boolean = maybe;
}
function error(message: string): never {
throw new Error(message);
}
function fail() {
return error("failde");
}
function infiniteLoop(): never {
while(true) {}
}
// T가 만약에 string이면 T를 T & {[index: string]: any}이렇게 내보내고 아니면 never를 내보내라
// 잘못된 타입이 들어오는 것을 막고자 never를 사용한다.
type Indexable<T> = T extends string ? T & {[index: string]: any} : never;
type ObjectIndexable = Indexable<{}>;