Closed moonheekim0118 closed 2 years ago
νμ μ€ν¬λ¦½νΈμ λͺ©ν μ€ νλλ λ°νμμ μ€λ₯λ₯Ό λ°μμν¬ μ½λλ₯Ό 미리 μ°Ύμλ΄λ κ².
ts.config νμΌ, tsc β initμΌλ‘ μ€μ μ ν΄μ€λ€
νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬
μ»΄νμΌμ νμ 체ν¬μ λ 립μ μΌλ‘ λμνκΈ° λλ¬Έμ, νμ μ€λ₯κ° μλ μ½λλ μ»΄νμΌμ΄ κ°λ₯νλ€
instanceof 체ν¬λ λ°νμμ μΌμ΄λμ§λ§, Rectangleμ νμ μ΄λΌ λ°νμ μμ μ μλ¬΄λ° μν μ ν μ μλ€.
ν΄κ²° λ°©λ²
in
μ¬μ©νκΈ°μλ°μ€ν¬λ¦½νΈλ λ νμ΄ν κΈ°λ°μ΄λ€. νμ μ€ν¬λ¦½νΈλ μ΄λ₯Ό λͺ¨λΈλ§νκΈ° μν΄ κ΅¬μ‘°μ νμ΄νμ μ¬μ©νλ€.
interface Vector2D {
x: number;
y: number;
}
interface NamedVector {
name: string;
x: number;
y: number;
}
function calculateLength(v: Vector2D){
return Math.sqrt(v.x * v.x + v.y * v.y)
}
const v: NamedVector = { x:3, y:4, name:'name' };
console.log(calculateLength(v));
λ€μ μ½λλ λ¬Έμ κ° λ°μνμ§ μλλ€. NamedVectorμ κ΅¬μ‘°κ° Vector2Dμ νΈνλλ€. μ¬κΈ°μ ꡬ쑰μ νμ΄νμ΄λΌλ μ©μ΄κ° μ¬μ©λλ€.
interface Vector2D {
x: number;
y: number;
}
interface Vector3D {
x: number;
y: number;
z: number;
}
function calculateLength(v: Vector2D){
return Math.sqrt(v.x * v.x + v.y * v.y)
}
function normalize(v: Vector3D){
const length = calculateLength(v);
return {
x: v.x / length,
y: v.y / length,
z: v.z / length,
}
}
λ€μκ³Ό κ°μ μ½λμμλ λ²κ·Έλ‘ μΈν΄ normalizeκ° 3D 벑ν°λ₯Ό κΈ°λ°μΌλ‘ μ°μ°λλ€. ꡬ쑰μ νμ΄νμ μμ΄μ Vector2Dμ νΈνλκΈ° λλ¬Έμ΄λ€. ν¨μλ₯Ό μμ±ν λ 맀κ°λ³μλ€μ μμ±λ€μ΄ 맀κ°λ³μμ νμ μ μ μΈλ μμ±λ§μ κ°μ§κΈ°λ§ μκ°νκΈ° μ½λ€(μ΄λ₯Ό sealed, precise νμ μ΄λΌκ³ λΆλ₯Έλ€) νμ μ€ν¬λ¦½νΈ νμ μμ€ν μ μ΄λ₯Ό ννν μ μμΌλ©° μ΄λ €(open)μλ€.
ν΄λμ€ λν ꡬ쑰μ νμ΄ν κ·μΉμ λ°λ₯Έλ€.
λΌμ΄λΈλ¬λ¦¬ κ°μ μμ‘΄μ±μ λΆλ¦¬ν μ μλ€.
interface Rectangle {
height: number;
width: number;
}
if(shape instanceof Rectangle) // μ€λ₯!
- νμ
μ λ°νμ μμ μ μλ¬΄λ° μν μ ν μ μλ€.
- νμ
μ€ν¬λ¦½νΈμ νμ
μ μ κ±° κ°λ₯νκΈ° λλ¬Έμ, μ€μ λ‘ μλ°μ€ν¬λ¦½νΈλ‘ μ»΄νμΌ λλ κ³Όμ μμ λͺ¨λ μΈν°νμ΄μ€, νμ
, νμ
ꡬ문μ κ·Έλ₯ μ κ±°λμ΄ λ²λ¦°λ€.
### λ°νμ νμ
μ μ μΈλ νμ
κ³Ό λ€λ₯Ό μ μλ€.
- μ΄λκ²½μ°? API νΈμΆλ‘ λ°μμ¨ κ°μ κ²½μ°
## ꡬ쑰μ νμ΄ν
```ts
interface Vector2D{
x:number;
y:number;
}
interface Vector3D{
x:number;
y:number;
z:number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
function calculateL1(v:Vector3D){
let length = 0;
for(const axis of Object.keys(v)){
const coord = v[axis]; // 'string' μ 'Vector3D'μ μΈλ±μ€λ‘ μ¬μ©ν μ μκΈ°μ μ리먼νΈλ μμμ μΌλ‘ 'any' νμ
μ
λλ€.
}
}
νμ μμ€ν μ μ μ μμ€ν μ λ°νμμ μ€λ₯λ₯Ό λ°μμν¬ μ½λλ₯Ό 미리 μ°Ύμλ΄λ κ²
const states = [
{name : 'Alabama', capital: 'Montgomer'},
{name : 'Alaska', captial :'Juneau'},
{name : 'Arizona', captial: 'Phoneix},
]
for (const state of states){
console.log(state.capitol);
}
->JSμΌ κ²½μ° undefinedκ° μΆλ ₯λλ€
->TSμΌ κ²½μ° captiol μμ±μ΄ μλ€λ μ€λ₯λ₯Ό μ‘μλΈλ€
interface State {
name: string;
captial: string;
}
const states:State[]
->νμ
ꡬ문μ μΆκ°ν κ²½μ° , μ¬λ°λ₯Έ ν΄κ²°μ±
λ μ μν΄μ€ μ μλ€
strictNullChecks
const x : number | null = null;
νμ μ€ν¬λ¦½νΈκ° ν μ μλ μΌ
νμ μ€λ₯κ° μλ μ½λλ μ»΄νμΌμ΄ κ°λ₯νλ€
λ°νμμλ νμ 체ν¬κ° λΆκ°λ₯νλ€
νμ μ°μ°μ λ°νμμ μν₯μ μ£Όμ§ μλλ€
function asNumber(val:number | string): number{
return typeof(val) === 'string' ? Number(val) : val;
λ°νμ νμ μ μ μΈλ νμ κ³Ό λ€λ₯Ό μ μλ€.
νμ μ€ν¬λ¦½νΈ νμ μΌλ‘λ ν¨μλ₯Ό μ€λ²λ‘λ ν μ μλ€.
νμ μ€ν¬λ¦½νΈ νμ μ λ°νμ μ±λ₯μ μν₯μ μ£Όμ§ μλλ€
νμ μ€ν¬λ¦½νΈλ (νμ μ΄ μ μλ) μλ°μ€ν¬λ¦½νΈμ μμ μ§ν©μ΄λ€.
λ°λ©΄ λͺ¨λ μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ΄ νμ μ€ν¬λ¦½νΈλΌλ λͺ μ λ μ°Έμ΄μ§λ§, λͺ¨λ νμ μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ΄ μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ μλλ€. νμ μ€ν¬λ¦½νΈλ λ³λμ λ¬Έλ²μ κ°μ§κΈ° λλ¬Έμ΄λ€.
function greet(who: string) { ... }
=> SyntaxError: Unexpected token :
: string
μ νμ
μ€ν¬λ¦½νΈμμ μ°μ΄λ νμ
ꡬ문μ΄λ€. νμ
ꡬ문μ μ¬μ©νλ μκ° μλ°μ€ν¬λ¦½νΈλ νμ
μ€ν¬λ¦½νΈμ μμμΌλ‘ λ€μ΄κ°λ€.
νμ μμ€ν μ λͺ©ν μ€ νλλ λ°νμμ μ€λ₯λ₯Ό λ°μμν¬ μ½λλ₯Ό 미리 μ°Ύμλ΄λ κ²μ΄λ€. νμ μ€ν¬λ¦½νΈλ βμ μ β νμ μμ€ν μ΄λ€. κ·Έλ¬λ νμ 체컀λ₯Ό ν΅κ³Όνλ©΄μ λ°νμ μ€λ₯λ₯Ό λ°μμν€λ μ½λλ μΆ©λΆν μ‘΄μ¬ν μ μλ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λ, μ€λ₯κ° λ°μνμ§λ μμ§λ§ μλμ λ€λ₯΄κ² λμνλ μ½λκ° μλ€. νμ μ€ν¬λ¦½νΈλ μ΄ μ€ λͺκ°μ§λ₯Ό μ°Ύμλ΄κΈ°λ νλ€.
const states = [
{ name: 'Alabama', capital: 'Montgomery' },
...
];
for (const state of states) {
console.log(state.capitol);
}
// μ€ν κ²°κ³Ό
undefined
루ν λ΄μ state.capitol
μ κ°λ°μκ° μλν μ½λκ° μλλ€. νμ
체컀λ μ΄λ μ€λ₯λ₯Ό μ°Ύμλ΄κ³ ν΄κ²°μ±
μ μ μνλ€.
νμ ꡬ문μ μΆκ°νμ¬ μ½λμ βμλβκ° λ¬΄μμΈμ§ νμ μ€ν¬λ¦½νΈμκ² μλ €μ£Όλ©΄ ν¨μ¬ λ λ§μ μ€λ₯λ₯Ό μ°ΎμλΌ μ μλ€.
const states = [
{ name: 'Alabama', capitol: 'Montgomery' },
...
];
for (const state of states) {
console.log(state.capital);
}
// μ€ν κ²°κ³Ό
undefined
μ΄λ νμ μ€ν¬λ¦½νΈλ stateμ capital μμ±μ΄ μμΌλ capitolμ μ¬μ©νκ² λκ³ ν΄κ²°μ± μ μ μνλ€. νμ μ€ν¬λ¦½νΈλ μ€λ₯λ₯Ό μΆμΈ‘ν μλ μμ§λ§ μ΄λ μͺ½μ΄ μ€νμΈμ§ νλ¨νμ§ λͺ» νλ€. λ°λΌμ λͺ μμ μΌλ‘ statesλ₯Ό μ μΈνμ¬ μλλ₯Ό λΆλͺ νκ² νλ κ²μ΄ μ’λ€.
λͺ¨λ μλ°μ€ν¬λ¦½νΈλ νμ μ€ν¬λ¦½νΈμ§λ§, μΌλΆ μλ°μ€ν¬λ¦½νΈλ§μ΄ νμ 체ν¬λ₯Ό ν΅κ³Όνλ€.
νμ μ€ν¬λ¦½νΈ νμ μμ€ν μ μ λ°μ μΌλ‘ μλ°μ€ν¬λ¦½νΈ λμμ λͺ¨λΈλ§νλ€. κ·Έλ¬λ μλ°μ€ν¬λ¦½νΈμμλ νμ©λμ§λ§ νμ μ€ν¬λ¦½νΈμμλ λ¬Έμ κ° λλ κ²½μ°κ° μλ€. μ΄λ° λ¬Έλ²μ μ격ν¨μ μ¨μ ν μ·¨ν₯μ μ°¨μ΄κ³ μ°μ΄μ κ°λ¦΄ μ μλ€.
νμ μ€ν¬λ¦½νΈ μ€μ μ κ°κΈμ μ€μ νμΌ tsconfig.jsonμ μ¬μ©νλ κ²μ΄ μ’λ€. κ·ΈλμΌ νμ μ€ν¬λ¦½νΈ μ¬μ© κ³νμ λλ£μ λ€λ₯Έ λꡬλ€μ΄ μ μ μλ€.
noImplicitAny
trueμΈ κ²½μ° - any νμ μ μ¬μ©ν λλ λͺ μμ μΌλ‘ anyλΌκ³ μ μΈν΄μΌνλ€.
falseμΈ κ²½μ° - any νμ μΌλ‘ μ§μ νμ§ μμλ, μ¦ μμμ μΌλ‘ any νμ μΌλ‘ κ°μ£Όλλ κ²μ νμ©νλ€.
strictNullChecks
nullκ³Ό undefinedκ° λͺ¨λ νμ μμ νμ©λλκ°
trueμΈ κ²½μ°
const x: number = null;
// μ€λ₯! 'null' νμμ 'number' νμμ ν λΉν μ μμ΅λλ€.
// μλμ κ°μ΄ μλλ₯Ό λͺ
μνμ¬ μ€λ₯λ₯Ό κ³ μΉ μ μλ€.
const x: number | null = null;
falseμΈ κ²½μ°
const x: number = null;
// μ μ! nullμ μ ν¨ν κ°
nullκ³Ό undefined κ΄λ ¨λ μ€λ₯λ₯Ό μ‘μ λ΄λ λ° λ§μ λμμ΄ λλ€.
βundefinedλ κ°μ²΄κ° μλλλ€β κ°μ λ°νμ μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ μ€μ νλ κ²μ΄ μ’λ€.
strict
μ격ν 체ν¬λ₯Ό νκ³ μΆλ€λ©΄ strict μ€μ μ κ³ λ €νλ€.
νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬μ λ κ°μ§ μν
μ΄λ μ»΄νμΌκ³Ό νμ 체ν¬λ λ 립μ μΌλ‘ λμνλ€.
νμ μ€λ₯κ° μλ μ½λλ μ»΄νμΌμ΄ κ°λ₯νλ€.
νμ μ€ν¬λ¦½νΈ μ€λ₯λ κ²½κ³ (warning)μ λΉμ·νλ€. μμ±ν νμ μ€ν¬λ¦½νΈκ° μ ν¨ν μλ°μ€ν¬λ¦½νΈλΌλ©΄ νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬λ μ»΄νμΌμ ν΄λΈλ€. λ°λΌμ βνμ 체ν¬μ λ¬Έμ κ° μλ€βκ³ λ§νλ κ²μ΄ μ νν ννμ΄λ€.
λ§μ½ μ€λ₯κ° μμ λ μ»΄νμΌνμ§ μμΌλ €λ©΄, tsconfig.jsonμ noEmitOnError
λ₯Ό μ€μ νλ€.
λ°νμμλ νμ 체ν¬κ° λΆκ°λ₯νλ€.
νμ μ°μ°μ λ°νμμ μν₯μ μ£Όμ§ μλλ€.
κ°μ μ μ νκΈ° μν΄μλ λ°νμμ νμ μ 체ν¬ν΄μΌ νκ³ μλ°μ€ν¬λ¦½νΈ μ°μ°μ ν΅ν΄ λ³νμ μνν΄μΌ νλ€.
λ°νμ νμ μ μ μΈλ νμ κ³Ό λ€λ₯Ό μ μλ€.
API μλ΅κ³Ό κ°μ΄ λ°νμμ κ²°μ λλ κ°μ κ²½μ° μ μΈλ νμμ΄ μΈμ λ λ¬λΌμ§ μ μμμ λͺ μ¬ν΄μΌ νλ€.
νμ μ€ν¬λ¦½νΈ νμ μΌλ‘λ ν¨μλ₯Ό μ€λ²λ‘λν μ μλ€.
νμ μ€ν¬λ¦½νΈ νμ μ λ°νμ μ±λ₯μ μν₯μ μ£Όμ§ μλλ€.
νμ μ€ν¬λ¦½νΈλ ꡬ쑰μ νμ΄νμ μ¬μ©νκΈ° λλ¬Έμ, μλ‘ λ€λ₯Έ νμ μ΄λΌλ κ΅¬μ‘°κ° νΈνλλ κ²½μ°, νμ μ²΄μ»€κ° μ€λ₯λ₯Ό μ‘μ§ μλλ€.
A νμ κ³Ό B νμ μ κ΅¬μ‘°κ° νΈνλλ κ²½μ°, 맀κ°λ³μκ° λ μ€ νλμ νμ μΈ ν¨μμ, λ€λ₯Έ νμ μ μΈμλ₯Ό μ£Όλ©΄μ νΈμΆμ΄ κ°λ₯νλ€.
interface Vector2D {
x: number;
y: number;
}
interface NamedVector {
name: string;
x: number;
y: number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
const v: NamedVector = { x: 3, y: 4, name: 'Zee' };
calculateLength(v);
ν¨μλ₯Ό μμ±ν λ, 맀κ°λ³μμ μμ±λ€μ΄ 맀κ°λ³μμ νμ μ μ μΈλ μμ±λ§μ κ°μ§ κ±°λΌ μκ°νκΈ° μ½λ€. μ΄λ¬ν νμ μ λ΄μΈλ(sealed), μ νν(precise) νμ μ΄λΌ λΆλ¦¬κ³ νμ μ€ν¬λ¦½νΈ νμ μμ€ν μμλ ννν μ μλ€. νμ μ μ΄λ €(open) μλ€.
νμ μμ€ν μ νμ μ΄ μ΄λ €μμμ μκ³ νμ μ νμΈνλ€.
interface Vector3D {
x: number;
y: number;
z: number;
}
function calculateLengthL1(v: Vector3D) {
let length = 0;
for (const axis of Object.keys(v)) {
const coord = v[axis];
// 'string'μ 'Vector3D'μ μΈλ±μ€λ‘ μ¬μ©ν μ μκΈ°μ μ리먼νΈλ μμμ μΌλ‘ 'any' νμ
μ
λλ€.
length += Math.abs(coord);
}
return length;
}
μμμ Vector3Dλ λ€λ₯Έ μμ±μ΄ μλ€κ³ κ°μ νμ§λ§, ν¨μμ μΈμλ‘ μ£Όμ΄μ§λ vλ μ΄λ€ μμ±μ΄λ κ°μ§ μ μλ€.
const vec3D = { x: 3, y: 4, z: 1, address: '123 Broadway' };
calculateLengthL1(vec3D); // μ μ
λ°λΌμ μ μ½λμ κ²½μ° v[axis]
κ° μ΄λ€ μμ±μ΄ λ μ§ μ μ μλ€. νμ
μ€ν¬λ¦½νΈκ° μ€λ₯λ₯Ό μ νν μ°ΎμλΈ κ²μ΄λ€.
ꡬ쑰μ μΌλ‘ νμν μμ±κ³Ό μμ±μκ° μ‘΄μ¬νλ€λ©΄, ν΄λμ€ μμ ꡬ쑰μ νμ΄νμΌλ‘ νμ μΌλ‘ ν λΉν μ μλ€.
ꡬ쑰μ νμ΄νμ νμ©νμ¬ κ΅¬μ²΄μ μΈ μΈν°νμ΄μ€λ₯Ό μ μνλ©΄ μ λ ν μ€νΈλ₯Ό λ μμ½κ² ν μ μλ€.
ꡬ쑰μ νμ΄ν λλΆμ mockingμ΄ νμν λΆλΆ(DB, API)μ μ€μ μΈν°νμ΄μ€λ₯Ό ꡬννλμ§ λͺ νν μ μΈν νμκ° μλ€. νμ μ λ§λ λ κ°λ¨ν κ°μ²΄λ₯Ό 맀κ°λ³μλ‘ μ¬μ©ν μ μλ€.
any νμ μλ νμ μμ μ±μ΄ μλ€.
as any
λ₯Ό ν΅ν΄ μ μΈλ νμ
κ³Ό λ€λ₯Έ νμ
μ ν λΉν μ μκ² λλ€.
anyλ ν¨μ μκ·Έλμ²λ₯Ό 무μν΄ λ²λ¦°λ€.
any νμ μΌλ‘ μ μΈλ λ³μλ λͺ¨λ νμ μ 맀κ°λ³μμ λ€μ΄κ° μ μλ€. μ¦ any νμ μ μ¬μ©νλ©΄ ν¨μμ μ½μλ νμ μ λ ₯κ³Ό μΆλ ₯μ 무μνκ² λλ€.
any νμ μλ μΈμ΄ μλΉμ€κ° μ μ©λμ§ μλλ€.
any νμ μ μ½λ 리ν©ν°λ§ λ λ²κ·Έλ₯Ό κ°μΆλ€.
any νμ μ λ§€κ° λ³μλ₯Ό κ°μ§λ ν¨μλ, λ§€κ° λ³μμ νμ μ΄ μ§μ λ ν¨μ μκ·Έλμ²κ° νμ μΌλ‘ μ§μ λ μ리μ κ°μΌλ‘ λ€μ΄κ° μ μλ€.
μ΄ κ²½μ° νμ 체컀λ₯Ό ν΅κ³Όν¨μλ λ°νμμλ μ€λ₯κ° λ°μνκ² λλ€. anyκ° μλ ꡬ체μ μΈ νμ μ μ¬μ©νλ€λ©΄ νμ μ²΄μ»€κ° μ€λ₯λ₯Ό λ°κ²¬νμ κ²μ΄λ€.
anyλ νμ μ€κ³λ₯Ό κ°μΆ°λ²λ¦°λ€.
anyλ νμ μμ€ν μ μ λ’°λλ₯Ό λ¨μ΄λ¨λ¦°λ€.
μμ’μ£!!!!!!!!πͺπππ§‘β€οΈππ