์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ดํ(dynamic typing) ์ธ์ด์ด๋ค. ๋ฐ๋ผ์, ์ฝ๋๋ฅผ ์คํํด๋ณด์์ผ๋ง ํ์ ์๋ฌ๊ฐ ๋๋์ง ๋ฑ์ ํ์ธํ ์ ์๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ ์ ์ ํ์ดํ(static typing)์ ํจ์ผ๋ก์จ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ํ์ ์ ์ถ๊ฐ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
tsc๋ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์ด๋ค
tsc hello.ts
: ํ์
์คํฌ๋ฆฝํธ ์๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ , hello.tsํ์ผ์ jsํ์ผ๋ก ์ปดํ์ผํ hello.js ํ์ผ์ output์ผ๋ก ๋ง๋ค์ด๋ธ๋ค.
tsc --noEmitOnError hello.ts
: ์ค๋ฅ๊ฐ ๋ณด๊ณ ๋ ๊ฒฝ์ฐ ์ถ๋ ฅ์ ๋ด๋ณด๋ด์ง ์๋๋ค. ์ฆ, ์๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ๋ง output์ ๋ง๋ค์ด๋ธ๋ค.
tsc --target es2015 hello.ts
: ํ์
์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ES3๋ฌธ๋ฒ์ผ๋ก ์ปดํ์ผ์ํ๋๋ฐ, --target ์ต์
์ผ๋ก ECMAScript ๋ฒ์ ์ ์ง์ ํ ์ ์๋ค.
ํ์ ์คํฌ๋ฆฝํธ์์ ๋ช ๋ฐฑํ ํ์ ๋ช ์๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
let msg = "hello there!";
: msg๊ฐ string์์ด ๋ช
๋ฐฑํจ
Type annotation์ ์ ๋ ํ๋ก๊ทธ๋จ ๋ฐํ์ ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ ์ฃผ์ (๋ฐํ์์ ์ ํ ๊ด์ฌ x)
noImplicitAny
: noImplicitAny์ต์
์ any ํ์
์ผ๋ก ์์ํ ํํ์๊ณผ ์ ์ธ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. ํ์
์คํฌ๋ฆฝํธ๋ any๋ก ์ง์ ๋ ๋ณ์์ ํ์
์ฒดํฌ๋ฅผ ํ์ง ์๋๋ค. ๋ฐ๋ผ์ any๋ ๊ฐ์ฅ ๊ด๋ํ ํ์
์ด๋ผ๊ณ ๋ ๋ณผ ์ ์์ง๋ง, ์ข
์ข
any ํ์
์ ํ์
์คํฌ๋ฆฝํธ์ ๋ณธ ๋ชฉ์ ์ ํ๋๊ฒ ํ๋ฉฐ ๋ฒ๊ทธ๋ฅผ ์ด๋ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ต๋ํ ํผํด์ผํ ํ์
์ด๋ค. (๋์ unknown ์ฌ์ฉ)
strictNullChecks
: null๊ณผ undefined๋ฅผ ๋์ฑ ๋ช
๋ฐฑํ ๋ค๋ฃฌ๋ค. null๊ณผ undefined๊ฐ ๋ช
๋ฐฑํ์ง ์์ผ๋ฉด ๊ฑท์ก์ ์ ์๋ ๋ฒ๊ทธ๋ฅผ ์ด๋ํ ์๋ ์์ผ๋ ์ด ๋์ ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ค์ํ๋ค!
optional ํ์ (?) ์ฌ์ฉ์ ํ ๋, undefined ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ด ์ค์ํ๋ค. (์๋ฐ์คํฌ๋ฆฝํธ์์ prop์ผ๋ก ๊ฐ์ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋ฐํ์ ์๋ฌ ๋์ ํด๋น ๊ฐ์ด undefined์ด ๋๊ธฐ ๋๋ฌธ)
Union Type์ ๋๊ฐ ์ด์์ ํ์ ์ผ๋ก ํ์ฑ๋ ํ์ ์ด๋ค. (ex) value: string | number)
Type Alias๋ ํ์ ์ ์ด๋ฆ์ ์ง์ ํด์ฃผ๋ ๊ฒ์ด๋ค. (ํ์ ์ ๋ณ์๋ก ์ ์ธํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฐ๋ )
(ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๋ ๋งจ๋ ์ฐ๋ ํํ์ธ๋ฐ, ์ด๋ฆ์ ์ ๋๋ก ๋ชฐ๋๋ค ๐)
Interface ์ ์ธ์ object ํ์ ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ ํ ์ ์๋ค.
// Type Alias
type Point = {
x: number;
y: number;
};
// Interface
interface Point {
x: number;
y: number;
}
Type Aliases๊ณผ Interfaces์ ์ฐจ์ด์ ?
interface๋ extends๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ํ์ฅํ ์ ์๋ค.
interface๋ ๋ค์์ฒ๋ผ ์กด์ฌํ๋ interface์ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
ํ์ง๋ง ๊ธฐ๋ฅ์ด ๊ฑฐ์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ธ ์ทจํฅ์ ๋ฐ๋ผ ์ ํํด์ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค.
Type Assertions์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ ์ ๊ตฌ์ฒด์ ์ผ๋ก ํ์ ํ์ง ๋ชปํ ๋ ์ด๋ฅผ ์ง์ ์ ์ผ๋ก ๋ช ์ํด ์ค ๋ ์ฌ์ฉ๋๋ค. (๊ทธ๋ฌ๋ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ปดํ์ผ ๋ ์ง์์ง๋ฏ๋ก ๋ฐํ์์์๋ ์ ํ ํจ์ฉ์ด ์๋ค!)
Literal Type์ string์ ๋ฌธ์ฅ๊ทธ๋๋ก๋ฅผ, number์ ํน์ ์๋ฅผ ๊ทธ๋๋ก ํ์ ์ผ๋ก ๋ณด๋ ๊ฒ์ด๋ค.
(ex) align: "left" | "right" | "center", returnType: -1 | 0 | 1)
(+ boolean์ ์๋ true | false union ํ์ ์ผ๋ก ๋์ด์์)
as const
๋ const์ ๋น์ทํ์ง๋ง, ํ์
์์คํ
์์ object์ ๋ชจ๋ ์์ฑ์ด ์ผ๋ฐ์ ์ธ string ๋๋ number ํ์
๋์ literal ํ์
์ด๋ผ๋๊ฒ์ ๋ณด์ฅํ๋ค.
const req = { url: "https://example.com", method: "GET" } as const;
x!.toString()
์ด๋ ๊ฒ ํ๋ฉด ํ์
์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. โ ํ์ง๋ง ๋ฐํ์๊ณผ๋ ๊ด๋ จ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผํจconst oneHundred: bigint = BigInt(100) ๋๋ 100n;
const firstName = Symbol("name");
const secondName = Symbol("name");
if (firstName === secondName) {
// firstName ๊ณผ secondName์ ๊ณ ์ ํ ํ์
์ ๊ฐ๋๋ค.
// Can't ever happen
}