개발일지
[TS] 2. 기본 타입 마스터 하기 본문
22.09.01 목
Basic:
JS type
Primitive
: number, string, boolean, bigint, symbol, null, undefinedObject
: function, array
number / string / boolean
// number
const num: number = -6;
// string
const str: string = 'hello';
// boolean
const boal: boolean = false;
undefined / null / unknown / any
undefined
: 값 있는지 없는지 결정되지 않은 상태null
: 비어있다!unknown
: 어떤 타입이 담길 지 알 수 없다!any
: 어떤 타입이든 담길 수 있다!
// undefined
let name: undefined; // 💩
let age: number | undefined;
age = undefined;
age = 1;
function find(): number | undefined {
return undefined;
}
// null
let person: null; // 💩
let person2: string | null;
// unknown 💩
let notSure: unknown = 0;
notSure = 'he';
notSure = true;
// any 💩
let anything: any = 0;
anything = 'hello';
void / never
// : void 생락 가능
function print(): void {
console.log('hello');
return;
}
let unusable: void = undefined; // 💩
// never
function throwError(message: string): never {
// message -> server (log)
throw new Error(message);
while (true) {}
}
let neverEnding: never; // 💩
object
// 어떤 object 형태든 가능
let obj: object; // 💩
function acceptSomeObject(obj: object) {}
acceptSomeObject({ name: 'ellie' });
acceptSomeObject({ animal: 'dog' });
Function:
JS vs TS
// JavaScript 💩
function jsAdd(num1, num2) {
return num1 + num2;
}
// TypeScript ✨
function add(num1: number, num2: number): number {
return num1 + num2;
}
// JavaScript 💩
function jsFetchNum(id) {
// code ...
// code ...
// code ...
return new Promise((resolve, reject) => {
resolve(100);
});
}
// TypeScript ✨
function fetchNum(id: string): Promise<number> {
// code ...
// code ...
// code ...
return new Promise((resolve, reject) => {
resolve(100);
});
}
Optional parameter
function printName01(firstName: string, **lastName?: string**) {
console.log(firstName);
console.log(lastName); // undefined
}
printName01('Steve', 'Jobs');
printName01('Ellie');
printName01('Anna');
function printName02(firstName: string, **lastName: string | undefined**) {
console.log(firstName);
console.log(lastName); // undefined
}
printName02('Steve', 'Jobs');
printName02('Ellie', undefined); //undefined 명시해줘야함
printName02('Anna', undefined);
Default parameter
function printMessage(**message: string = 'default message'**) {
console.log(message);
}
printMessage();
Rest parameter
function addNumbers(**...numbers: number[]**): number {
return numbers.reduce((a, b) => a + b);
}
console.log(addNumbers(1, 2));
console.log(addNumbers(1, 2, 3, 4));
console.log(addNumbers(1, 2, 3, 4, 5, 0));
Array:
Array
const fruits: string[] = ['🍅', '🍌'];
const scores: Array<number> = [1, 3, 4];
string[]
: readonly 가능Array<number>
: readonly 불가능
function printArray(fruits: **readonly string[]**) {}
Tuple
- interface, type alias, class로 대체해서 사용하는게 좋음!
- 튜플 권장X
- 인덱스로 접근 힘듦
- 가독성 떨어짐
- object, class 같은 경우
student.name
이런 식으로 접근 가능 (권장)
let student: [string, number];
student = ['name', 123];
student[0]; // name
student[1]; // 123
const [name, age] = student;
console.log(name); //name
console.log(age); //123
Type Aliases:
type 커스텀 하기
type Text = string;
const name: Text = 'ellie';
const address: Text = 'korea';
type Num = number;
type Student = {
name: string;
age: number;
};
const student: Student = {
name: 'ellie',
age: 12,
};
String Literal Types
type Name = 'name';
let ellieName: Name;
ellieName = 'name';
type JSON = 'json';
const json: JSON = 'json';
type Boal = true; // 이런 식으로도 가능은 함
Union types: | (OR)
type Direction = 'left' | 'right' | 'up' | 'down';
function move(direction: Direction) {
console.log(direction);
}
move('down');
type TileSize = 8 | 16 | 32;
const tile: TileSize = 16;
ex)
// function: login -> success, fail ⏱
type SuccessState = {
response: {
body: string;
};
};
type FailState = {
reason: string;
};
type LoginState = SuccessState | FailState;
function loginn(): LoginState {
return {
response: {
body: 'logged in!',
},
};
}
// printLoginState(state: LoginState)
// success -> 🎉 body
// fail -> 😭 reason
function printLoginStatee(state: LoginState) {
// state.response or state.reason 안됨!
// 상태가 Success인지 Fail인지 알 지 못하기 때문
if ('response' in state) { ⭐️
console.log(`🎉 ${state.response.body}`);
} else {
console.log(`😭 ${state.reason}`);
}
}
Discriminated:
// function: login -> success, fail ⏱
type SuccessState = {
result: 'success'; // 공통 property ⭐️
response: {
body: string;
};
};
type FailState = {
result: 'fail'; // 공통 property ⭐️
reason: string;
};
type LoginState = SuccessState | FailState;
function login(): LoginState {
return {
result: 'success', ⭐️
response: {
body: 'logged in!', ⭐️
},
};
}
// printLoginState(state: LoginState)
// success -> 🎉 body
// fail -> 😭 reason
function printLoginState(state: LoginState) {
if (state.result === 'success') { ⭐️
console.log(`🎉 ${state.response.body}`);
} else {
console.log(`😭 ${state.reason}`);
}
}
Intersection Types: & (AND)
type Student = {
name: string;
score: number;
};
type Worker = {
empolyeeId: number;
work: () => void;
};
function internWork(person: Student & Worker) {
console.log(person.name, person.empolyeeId, person.work());
}
internWork({
name: 'ellie',
score: 1,
empolyeeId: 123,
work: () => {},
});
Enum:
// JavaScript
const MAX_NUM = 6;
const MAX_STUDENTS_PER_CLASS = 10;
const MONDAY = 0;
const TUESDAY = 1;
const WEDNESDAY = 2;
const DAYS_ENUM = Object.freeze({ MONDAY: 0, TUESDAY: 1, WEDNESDAY: 2 });
const dayOfToday = DAYS_ENUM.MONDAY;
// TypeScript
enum Days {
Monday, // 0
Tuesday, // 1
Wednesday, // ...
Thursday, // string 타입 지정 가능! > 모두 명시해줘야함
Friday,
Saturday,
Sunday,
}
console.log(Days.Monday); // 0
- union type 사용 권장
- TS는 타입 추론 가능이 가능 하기에 타입 보장 불가능
let day: Days = Days.Saturday;
**day = Days.Tuesday; // 1 (number)
day = 10; // 임의의 숫자 지정 가능**
console.log(day);
// union type 사용 하자..!
type DaysOfWeek = 'Monday' | 'Tuesday' | 'Wednesday';
let dayOfweek: DaysOfWeek = 'Monday';
dayOfweek = 'Wednesday';
Type Inference:
타입 추론
- void 제외하고는 명시해주는게 좋음!
- but 회사 규칙에 따르자 ,,
let text = 'hello';
function print(message = 'hello') {
console.log(message);
}
print(); // return string
function add(x: number, y: number) {
return x + y;
}
const result = add(1, 2); // return number
Type Assertions 💩
function jsStrFunc(): any {
// return 'hello';
return 2;
}
const result = jsStrFunc();
console.log((result as string).length); // 런타임 error 발생 하지는 않음,,but undefined
console.log((<string>result).length);
const wrong: any = 5;
console.log((wrong as Array<number>).push(1)); // 😱 Error!!
function findNumbers(): number[] | undefined {
return undefined;
}
const numbers = **findNumbers()!**;
numbers.push(2); // 😱
numbers!.push(5);
const button = document.querySelector('class')!;
'JS, TS > [TS | 강의] TS·OOP' 카테고리의 다른 글
[TS] 7. 제네릭-Quiz (0) | 2022.10.30 |
---|---|
[TS] 6. 제네릭 (0) | 2022.10.30 |
[TS] 5. 객체지향 프로그래밍-Quiz (0) | 2022.10.30 |
[TS] 4. 객체지향 프로그래밍 (0) | 2022.10.30 |
[TS] 3. 기본 타입-Quiz (0) | 2022.10.30 |