Jieunny์ ๋ธ๋ก๊ทธ
[TS] 2. Usage ๋ณธ๋ฌธ
๐ฃ Module
โ๏ธ ๋ชจ๋์ ์ ์ญ ๋ณ์๊ณผ ๊ตฌ๋ถ๋๋ ์์ฒด ์ ํจ ๋ฒ์๋ฅผ ๊ฐ์ง๋ฉฐ export, import์ ๊ฐ์ ํค์๋ ์์ด๋ ๋ค๋ฅธ ํ์ผ์์ ์ ๊ทผํ ์ ์๋ค.
๐ฃ Export, Import
โ๏ธ ES6์ export์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณ์, ํจ์, ํ์ , ์ธํฐํ์ด์ค ๋ฑ์ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
โ JS ES6 ๋ฌธ๋ฒ
โฐ 2015๋ ์ ์ถ์๋ ECMAScript, ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ค
โฐ let, const ํค์๋ ์ถ๊ฐ
โฐ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด, ๊ฐ์ฒด ๋ฆฌํฐ๋ด, ํ์ดํ ํจ์ ๋ฑ์ด ์ถ๊ฐ ๋ ๋ฌธ๋ฒ
// math.ts
export interface Triangle {
width: number;
height: number;
}
// index.ts
import { Triangle } from './math.ts';
class SomeTriangle implements Triangle {
//...
}
import { WheatBeerClass } from './index.ts';
class Cloud extends WheatBeerClass {
}
โ Extends VS Implements
โ๏ธ Extends
โฐ ์์๋ฐ๊ณ ์ ํ๋ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ช ์ํ๋ ๊ฒ
โฐ ํด๋น ํด๋์ค์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ๊ตฌํํ๊ธฐ ์์๋ ์ธ์คํด์ค์์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
โฐ '๋ถ๋ชจ ๊บผ ๋ง๋๋ก ๊ฐ๋ค ์ธ ์ ์์'
โ๏ธ Extends
โฐ ๋ฏธ๋ฆฌ ์ถ์ํ ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฑํํ์ฌ ์ฌ์ฉํ๋ ๊ฒ
โฐ ์์๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ์ฑํํ๋ฉด ์ถ์ํ ๋ ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ค.
โฐ 'ํด๋น ํด๋์ค๋ ์ด ์ธํฐํ์ด์ค ๋ชจ์์ด๋๊น ๋ฐ๋์ ์ด ์กฐ๊ฑด์ ๊ฐ์ ธ์ผ ํด'
๐ฃ TS๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ณํํ ๊น?
โ๏ธ tsconfig.json ํ์ผ์ ์ค์ ํ ์ปดํ์ผ๋ฌ ๋ชจ๋์ ๋ฐ๋ผ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅด๊ฒ ๋ณํ๋๋ค.
# commonjs ๋ชจ๋์ธ ๊ฒฝ์ฐ
tsc --module commonjs Test.ts
# amd ๋ชจ๋์ธ ๊ฒฝ์ฐ
tsc --module amd Test.ts
๐ฃ d.ts ํ์ผ
โ๏ธ ํ์ ์คํฌ๋ฆฝํธ ์ ์ธ ํ์ผ๋ก, ์ฝ๋์ ํ์ ์ถ๋ก ์ ๋๋ ํ์ผ
โ๏ธ ๊ธฐ์กด JS๋ก ๋ง๋ค์ด์ง ์จ๋ํํฐ ๋ชจ๋๋ค์ TSํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ๋ก ํ์ ๋ง ์ ๋ฆฌํด์ ๋ฃ์ด๋ ํ์ผ
declare const global = "sth";
โฐ ์ ์ญ ๋ณ์๋ก ์ ์ธํ ๋ณ์๋ฅผ ํน์ ํ์ผ์์ import ๊ตฌ๋ฌธ ์์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ๋ณ์๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ค.
โฐ ๊ทธ๋ด ๋, ์์ฒ๋ผ ํด๋น ๋ณ์๋ฅผ ์ ์ธํด์ ์๋ฌ๊ฐ ๋์ง ์๊ฒ ํ ์ ์๋ค.
โ๏ธ ์ ์ญ ๋ณ์์ ์ ์ญ ํจ์์ ๋ํ ํ์ ์ ์ธ
โฐ ํด๋น ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์์ ์ฌ์ฉํ ์ ์์ง๋ง ์ ์ธ๋์ด ์์ง ์์ ์ ์ญ ๋ณ์๋ ์ ์ญ ํจ์๋ ํ์ ์ ์ ์ธํ ์ ์๋ค.
// ์ ์ญ ๋ณ์
declare const pi = 3.14;
// ์ ์ญ ํจ์
declare namespace myLib {
function greet(person: string): string;
let name: string;
}
myLib.greet('์บกํด');
myLib.name = 'ํ๋
ธ์ค';
โ declare & declare namespace
โ๏ธ declare
โฐ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์๊ฒ ํน์ ํ ๋ณ์๊ฐ ์๋ค๊ณ ์ ์ธํ๋ ํค์๋
โฐ ๋ด๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ฌ์ฉ์์๊ฒ ์๋ ค์ค ๋ชฉ์ ์ผ๋ก d.ts ํ์ผ์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
โ๏ธ declare namespace
โฐ ์ปดํ์ผ๋ฌ๋ namespace๋ก ์ ์ธํ TS ์ฝ๋๋ฅผ JS ์ผ๋ฐ ๊ฐ์ฒด๋ก ์ปดํ์ผ ํ๋๋ฐ, declare ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด JS ์ฝ๋๋ก ์ปดํ์ผ์ ํ์ง ์๋๋ค.
โฐ ๊ฐ์ฒด์ ํ์ ์ ๋ณด๋ง ์๋ ค์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋๋ค.
๐ฃ ์ธ๋ฑ์ฑ
โ๏ธ ๋ฐฐ์ด ์์ ์ ๊ทผ
interface StringArray {
[index: number]: string;
}
const arr: StringArray = ['Thor', 'Hulk'];
arr[0]; // 'Thor'
โฐ ํ์ ์คํฌ๋ฆฝํธ์์๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ์ธ๋ฑ์ฑ ํ์ ์ ์ ์ํ ์ ์๋ค.
โฐ ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ํ์ ์ ์ซ์, ์ด ์ธ๋ฑ์ค๋ก ํน์ ์์๋ฅผ ์ ๊ทผํ์ ๋ ํด๋น ์์์ ํ์ ์ string ์ด๋ผ๋ ๊ฒ์ ๋ช ์ํ๋ค.
โ๏ธ ํ์ ์ผ๋ก ๋ฐฐ์ด ๋ณ๊ฒฝ ์ ํํ๊ธฐ
interface ReadonlyStringArray {
readonly [index: number]: string;
}
const arr: ReadonlyStringArray = ['Thor', 'Hulk'];
arr[2] = 'Capt'; //์๋ฌ!
โฐ ๋ฐฐ์ด์ ์์๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ํ๋ ค๋ฉด readonly๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค.
๐ฃ ์ ํธ๋ฆฌํฐ ํ์
โ๏ธ ์ด๋ฏธ ์ ์ํด ๋์ ํ์ ์ ๋ณํํ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ ํ์ ๋ฌธ๋ฒ
โ๏ธ ์ ํธ๋ฆฌํฐ ํ์ ์ ์ฐ์ง ์์๋ ๊ธฐ์กด ๋ฌธ๋ฒ์ผ๋ก ํ์ ์ ๋ณํํ ์ ์์ง๋ง, ์ ํธ๋ฆฌํฐ ํ์ ์ ์ฐ๋ฉด ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ฒ ๊ฐ๋ฅํ๋ค.
๐ฃ ์์ฃผ ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ ํ์
1๏ธโฃ Partial<Type>
โฐ ํน์ ํ์ ์ ๋ถ๋ถ ์งํฉ์ ๋ง์กฑํ๋ ํ์ ์ ์ ์ํ ์ ์๋ค.
interface Address {
email: string;
address: string;
}
type MayHaveEmail = Partial<Address>;
const me: MayHaveEmail = {}; //๊ฐ๋ฅ
const you: MayHaveEmail = { email: 'test@abc.com' }; //๊ฐ๋ฅ
const all: MayHaveEmail = { email: 'capt@hero.com', address: 'Pangyo' }; //๊ฐ๋ฅ
โฐ ์๋ฌด ์์ฑ์ ๊ฐ์ง์ง ์๊ฑฐ๋, ํ๋๋ง ๊ฐ์ง๊ฑฐ๋, ๋ชจ๋ ๊ฐ์ง๋ ํ์ ์ ์ ์ํ ์ ์๋ค.
2๏ธโฃ Pick<Type, Keys>
โฐ ํน์ ํ์ ์์ ๋ช ๊ฐ์ ์์ฑ์ ์ ํํ์ฌ ํ์ ์ ์ ์ํ ์ ์๋ค.
โฐ Type์์ keys์ ์งํฉ์ ์ ํํด ํ์ ์ ์์ฑ
interface Hero {
name: string;
skill: string;
}
const human: Pick<Hero, 'name'> = {
name: '์คํฌ์ด ์๋ ์ฌ๋',
};
โฐ name ์์ฑ๋ง ์ ํํด์ ์ ์ ๊ฐ๋ฅ
type HasThen<T> = Pick<Promise<T>, 'then' | 'catch'>;
let hasThen: HasThen<Number> = Promise.resolve(4);
hasThen.then //์์์ 'then'๋ง ์ ํํ๋ฉด 'then'๋ง ์ ๊ณต, 'catch' ์ ํํ๋ฉด 'catch'๋ง ์ ๊ณต
โฐ ํ์ ์คํฌ๋ฆฝํธ์์ Promise๋ ์์ฒ๋ผ ์ ๋ค๋ฆญ ํด๋์ค ํํ๋ก ์ฌ์ฉํ๋ค.
3๏ธโฃ Omit<Type, Keys>
โฐ ํน์ ํ์ ์์ ์ง์ ๋ ์์ฑ๋ง ์ ๊ฑฐํ ํ์ ์ ์ ์ํด ์ค๋ค.
โฐ Type์์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ ํํ๊ณ keys๋ฅผ ์ ๊ฑฐํ ํ์ ์ ์์ฑ
interface AddressBook {
name: string;
phone: number;
address: string;
company: string;
}
const phoneBook: Omit<AddressBook, 'address'> = {
name: '์ฌํ๊ทผ๋ฌด',
phone: 123422223333,
company: '๋ด ๋ฐฉ'
}
const chingtao: Omit<AddressBook, 'address'|'company'> = {
name: '์ค๊ตญ์ง',
phone: 44455556666
}
๐ฃ ๋งต๋ ํ์ (Mapped Type)
โ๏ธ ๊ธฐ์กด์ ์ ์๋์ด ์๋ ํ์ ์ ์๋ก์ด ํ์ ์ผ๋ก ๋ณํํด ์ฃผ๋ ๋ฌธ๋ฒ์ ์๋ฏธํ๋ค.
โ๏ธ ๋ง์น JS์ map() API ํจ์๋ฅผ ํ์ ์ ์ ์ฉํ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง๋ค.
โ๏ธ ๋งต๋ ํ์ ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
โฐ ์๋ฐ์คํฌ๋ฆฝํธ์ map ํจ์๋ฅผ ํ์ ์ ์ ์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
{ [ P in K ] : T }
{ [ P in K ] ? : T }
{ readonly [ P in K ] : T }
{ readonly [ P in K ] ? : T }
โ๏ธ ๋งต๋ ํ์ ์ ๊ธฐ๋ณธ ์์
type Heroes = 'Hulk' | 'Thor' | 'Capt';
โฐ ํํฌ, ํ ๋ฅด, ์บกํด์ ์ ๋์จ ํ์ ์ผ๋ก ๋ฌถ์ด์ฃผ๋ Heroes ํ์
โฐ ์ธ ์์ ์ ์ด๋ฆ์ ๊ฐ๊ฐ ๋์ด๊น์ง ๋ถ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด?
type HeroProfiles = { [K in Heroes]: number );
const heroInfo: HeroProfiles = {
Hulk: 54,
Thor: 1000,
Capt: 33,
}
โฐ Heroes ํ์ ์ 3๊ฐ์ ๋ฌธ์์ด์ ๊ฐ๊ฐ ์ํํ์ฌ number ํ์ ์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฒด์ ํค๋ก ์ ์๊ฐ ๋๋ค.
type HeroProfiles = {
Hulk: number;
Thor: number;
Capt: number;
}
โ๏ธ ๋งต๋ ํ์ ์ ์ค์ฉ ์์ 1
type Subset<T> = {
[K in keyof T]? : T[K];
}
โฐ ํค์ ๊ฐ์ด ์๋ ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ํ์ ์ ๋ฐ์ ๊ทธ ๊ฐ์ฒด์ ๋ถ๋ถ ์งํฉ์ ๋ง์กฑํ๋ ํ์ ์ผ๋ก ๋ณํํด์ฃผ๋ ๋ฌธ๋ฒ
interface Person {
age: number;
name: string;
}
const ageOnly: Subset<Person> = { age: 23 };
const nameOnly: Subset<Person> = { name: 'Tony' };
const ironman: Subset<Person> = { age: 23, name: 'Tony' };
const empty: Subset<Person> = {};
โ๏ธ ๋งต๋ ํ์ ์ ์ค์ฉ ์์ 2
โฐ ์ฌ์ฉ์ ํ๋กํ์ ์กฐํํ๋ API ํจ์
interface UserProfile {
username: string;
email: string;
profilePhotoUrl: string;
}
function fetchUserProfile(): UserProfile {
//...
}
โฐ ํ๋กํ์ ์ ๋ณด๋ฅผ ์์ ํ๋ API
type UserProfileUpdate = {
[p in keyof UserProfile]?: UserProfile[p]
}
'Study > TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TS] ํจ์์ ๋ฉ์๋ (0) | 2023.02.01 |
---|---|
[TS] ๊ฐ์ฒด์ ํ์ (2) | 2023.02.01 |
[TS] ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (0) | 2023.01.30 |
[TS] 1. Fundamentals (0) | 2023.01.26 |
[TS] 0. TypeScript๋? (0) | 2023.01.26 |