ํ์ ์คํฌ๋ฆฝํธ๋ type, interface, enum ํค์๋ ๋ฐ ํด๋์ค ์ ์ธ์ผ๋ก ์ปค์คํ ํ์ ์ ๋ง๋ค ์ ์๋ค.
์๋ก์ด ํ์ ์ ์ ์ธํ๊ฑฐ๋ ํ์ ๋ณ์นญ์ ์ฌ์ฉํด ์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ถ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ.
// 2_10.ts
type Foot = number;
type Pound = number;
// 2_11.ts
type Patient = {
name: string;
height: Foot; // Footํ์
๋ณ์นญ ์ฌ์ฉ
weight: Pound ; // Poundํ์
๋ณ์นญ ์ฌ์ฉ
}
ํ์ ๋ณ์นญ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์ปดํ์ผ ๋์ง ์์ต๋๋ค.
// 2_12.ts
let patient: Patient = { // ๊ฐ์ฒด ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์ธ์คํด์ค ๋ง๋ฌ.
name: 'Joe Smith',
height: 5,
weight: 100,
}
๋ง์ฝ ์ฌ๊ธฐ์ weight๊ฐ ๋น ์ง๋ฉด, weight๊ฐ ์๋ค๊ณ ์๋ฌ๊ฐ ๋ฐ์.
ํด๋น ํ๋กํผํฐ๊ฐ ํ์๊ฐ ์๋๋ผ ์ต์ ์ด๋ผ๋ฉด, ํ๋กํผํฐ ์ด๋ฆ์ ?๋ฅผ ๋ถ์ฌ ์กฐ๊ฑด๋ถ ํ๋กํผ ํ์ ์ ์ ์ธํฉ๋๋ค.
// 2_13.ts
type Patient2_13 = {
name: string;
height: Foot; // Footํ์
๋ณ์นญ ์ฌ์ฉ
weight?: Pound ; // Poundํ์
๋ณ์นญ ์ฌ์ฉ
}
let patient2_13: Patient2_13 = { // ๊ฐ์ฒด ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์ธ์คํด์ค ๋ง๋ฌ.
name: 'Joe Smith',
height: 5,
}
โ ํด๋์ค๋ ์ธํฐํ์ด์ค์์ ๋ฌผ์ํ๋ฅผ ์ถ๊ฐํด ์กฐ๊ฑด๋ถ ํ๋กํผํฐ๋ฅผ ์ ์ ํ ์ ์๋ค.
ํจ์ ์๊ทธ๋์ฒ์๋ ํ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํผ ์์์ด ์๊ณ ์
๋ ฅ๋ ๊ฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ValidatorFn์ด๋ผ๋ ํจ์๋ฅผ ๊ตฌํํด๋ณด์.
ValidatorFnํจ์์ ํน์ ์๊ทธ๋์ฒ๊ฐ ํ์ํฉ๋๋ค. FormControlํ์
๊ฐ์ฒด๋ฅผ ๋ฐ์ ๊ฐ์ด ์ ํจํ ๊ฒฝ์ฐ null์ ๋ฐํํ๊ณ ์๋๋ฉด ์ค๋ฅ๋ฅผ ์ค๋ช
ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
type ValidatorFn =
(c: FormControl) => {[key: string]: any} | null
{[key: string]: any}๋ ๋ชจ๋ ํ์ ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
class FormControl{
constructor (initialValue: string, validator: ValidatorFn | null){...};
}
FormControl ํด๋์ค ์์ฑ์๋ฅผ ๋ง๋ค ๋ ์์ ์ ์ํ ์ปค์คํ ํ์ ValidatorFn์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ๊ฐ๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํด๋์ค ํ๋กํผํฐ๋ฅผ ์ ์ธํ๋ ๊ตฌ๋ฌธ์ด ์์ง๋ง ํ์ ์คํฌ๋ฆฝํธ๋ ์๋๋ค.
class Person{
firstName: string;
lastname: string;
age: number;
}
const p = new Person();
p.firstName = 'John';
p.lastName = 'Smith';
p.age = '25';
ts->js ES6๋ก ๋ณํ
"use strict";
class Person{}
const p = new Person();
p.firstName = 'John';
p.lastName = 'Smith';
p.age = '25';
JS์ฝ๋์์ Person์ด ๋น์ด์๋๊ฑธ ๋ณผ ์ ์๋ค.
Person์์ฑ์๋ฅผ ์ ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ ํ์ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํจ.
์์ฑ์๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์์ฑ๋ ํ์ ํ๋ฒ๋ง ์คํ๋๋ ํน๋ณํ ํจ์์ด๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ ์ฝ๋ ํ์ค๋ก ํด๋์ค๋ฅผ ์ธ์คํด์คํ๊ณ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค.
์์ฑ์์ ํ๋ผ๋ฏธํฐ ๋ฑ์ ํ์
์ ํ๊ธฐ ๊ฐ๋ฅ
ํ์ ์คํฌ๋ฆฝํธ๋ ์ ๊ทผ์ ์ด์๊ฐ ์๊ณ readonly , private, protected, public 4๊ฐ์ ํค์๋๊ฐ ์๋ค.
class Person{
constructor(public firstName: string,
public lastName: string, public age: number) {};
}
const p = new Person('John', 'Smith', 25);
๋ณํ
"use strict";
class Person{
constructor(firstName, lastName, age){
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
;
}
const p = new Person('John', 'Smith', 25);
const p์์ ๋ณ๋์ ํ์ ์์ด ์ ์ธ ํ์ง๋ง
const p:Person = new Person('John', 'Smith', 25);
์์ฒ๋ผ ์์ ํ์ฌ ๋ช ํํ๊ฒ ์์ฑํ ์ ์๋ค.
โ ํ์
์คํฌ๋ฆฝํธ ํด๋์ค ๋ด ๊ฐ ์์ฑ์ ํ๋ผ๋ฏธํฐ์ public ์ ๊ทผ ์ ์ด์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์ฑ๋ ํ๋กํผํฐ๋ ํด๋์ค ๋ด๋ถ์ ์ธ๋ถ ๋ชจ๋ ์ ๊ทผ ํ ์ ์๋ค.
ํด๋์ค ํ๋กํผํฐ๋ฅผ ์ ์ธ ํ ๋ readonly ์ ํ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
( ํด๋์ค ์์ฑ์ ๋ด๋ถ ๋ฑ์ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ, ๊ฐ์ด ๋ฐ๋์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ )
const์ ๋น์ทํ์ง๋ง ํด๋์ค ํ๋กํผํฐ์ const๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
์ธํฐํ์ด์ค๋ ๊ฐ์ฒดํ๋กํผํฐ ๋๋ ๋ฉ์๋๊ตฌํ์ ์ํด ์ฌ์ฉ๋จ. ( JS์๋ ์๋ค. )
๋ ํค์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์ปดํ์ผ ๋์ง ์์.
๊ฐ๋ฐ๋์ค ์๋ชป๋ ํ์
์ ํผํ ์ ์๊ฒ ๋์์ฃผ๋ ์ญํ .
// 2_16.ts
interface Person{
firstName: string;
lastName: string;
age: number;
}
์ปค์คํ
ํ์
์ class์ ๊ฐ์ด ์ ์ธํ๋ฉด ๋ง์น ๊ฐ์ฒ๋ผ ์ฌ๋ฌ๋ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
(์์ new ํค์๋ ์ฒ๋ผ ์ธ์คํด์คํ ๊ฐ๋ฅ)
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํด๋น ์ฝ๋๊ฐ ํฌํจ์ด ๋๋ค. (ES5 - ํจ์, ES6 - ํด๋์ค๋ก ์ปดํ์ผ)
interface Person {
firstName: string;
lastName: string;
age: number;
}
function savePerson (person: Person): void{
console.log('Saving ' , person);
}
const p:Person = {
firstName: 'John',
lastName: 'Smith',
age: 25
};
savePerson(p);
"use strict";
function savePerson(person){
console.log('Saving ' , person);
}
const p = {
firstName: 'John',
lastName: 'Smith',
age: 25
}
savePerson(p);
์ด์ฒ๋ผ savePerson์ ๋ค์ด์จ ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค Person๋ด ํ๋กํผํฐ์ ๋น๊ตํ๋ฉฐ ํ์ธํจ.
Personํ์ ์ ์ญ์ ํด๋ savePersonํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ํ์ ์คํฌ๋ฆฝํธ์ ๊ตฌ์กฐ์ ํ์ ์์คํ ๋๋ฌธ
ํ์ ์คํฌ๋ฆฝํธ๋ ๋ ํ์ ์ ๊ตฌ์กฐ๋ง์ ๊ฐ์ง๊ณ ํธํ์ฑ์ ๊ฒฐ์ ํฉ๋๋ค. => ๋ฉค๋ฒ๊ฐ ์๋ก ์ผ์นํ๋ค๋ฉด ์๋ก ํธํ๋์ด ๋ช ์์ ์ธ ํ์๋ ํ์ํ์ง ์์ต๋๋ค.
๋ ๊ฐ์ ํ์ ์ด ์์ ๋ ๊ฐ์์ง ๋ค๋ฅธ์ง ์ด๋ป๊ฒ ์ ์ ์์๊น?
๋ช ๋ชฉ์ ํ์ ์์คํ ( ์๋ฐ ๋ฑ )์ ์ฌ์ฉํ๋ ์ธ์ด๋ค์ ๊ฐ์ ๋ค์์คํ์ด์ค ์์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ์ธ๋ ํด๋์ค๋ฅผ ๋์ผํ๋ค๊ณ ํ๋จํจ.
์ฆ, Personํ์ ๋ณ์์๋ Person ํ์ ๊ฐ์ฒด๋ ์ด๋ฅผ ์์๋ฐ์ ํด๋์ค์ ๊ฐ์ฒด๋ง ๋ฃ์ ์ ์๋ค.
// 2_17.java
class Person {
String name;
}
class Customer {
String name;
}
Customer cust = new Person(); // ํด๋์ค ์ด๋ฆ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๋์ง ์๋๋ค.
ํด๋์ค ์ด๋ฆ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๋์ง ์๋๋ค.
// 2_18.ts
class Person2_18{
name: string;
}
class Customer2_18{
name: string;
}
const cust:Customer2_18 = new Person2_18(); // ๊ฐ์ ๊ตฌ์กฐ๋ผ ์ค๋ฅ ๋ฐ์ X
ํ์ ์คํฌ๋ฆฝํธ๋ ๊ตฌ์กฐ์ ํ์ ์์คํ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์.
// 2_19.ts
class Person2_19{
name: string;
}
class Customer2_19{
name: string;
}
const cust:Customer2_19 = { name: 'Mary'};
const pers:Person2_19 = { name: 'John'};
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํด ๊ตฌ์กฐ๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ํด๋์ค ํ์ ๋ณ์๋ ์์์ ํ ๋นํ ์ ์๋ค.
โ ์ ๊ทผ์ ์ด์๋ ํ์
ํธํ์ฑ์ ์ํฅ์ ์ค๋๋ค.
name์ด private์ธ ๊ฒฝ์ฐ ์ปดํ์ผ ๋์ง ์์ต๋๋ค.
Person๊ณผ Customer ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ค๋ฉด?
// 2_20.ts
class Person2_20{
name: string;
age: number;
}
class Customer2_20{
name: string;
}
const cust:Customer2_20 = new Person2_20();
name์ ๊ฐ์ง Customerํ์ ์ ์์๋ฅผ ์ฌ์ฉํด name์ ๊ฐ์ง Person2_20์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์ค๋ฅX
Person์ธ์คํด์ค๋ name์ด ์กด์ฌํ๋ฏ๋ก cust.name='John'์ด ๊ฐ๋ฅ.
โ Customerํ์ ์ธ ๋ณ์ ๊ฐ์ Person ํ์ ์ด ใด๊ฐ์ฒด๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์ Personํ์ ์ Customerํ์ ์ ํ ๋น ๊ฐ๋ฅํ๋ค๊ณ ๋งํ ์ ์๋ค.
๋ฐ๋๋?
// 2_21.ts
class Person2_21{
name: string;
}
class Customer2_21{
name: string;
age: number;
}
const cust21:Customer2_21 = new Person2_21(); // ์ค๋ฅ ๋ฐ์
Person์์ age๋ฅผ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์.
์ ๋์จ์ ๋ณ์์ ์ง์ ํ ์ ์๋ ํ์ ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
// 2_22.ts - ๊ฐ ์ก์
์ด js์คํ์ผ๋ก ์ฝ๋ฉ๋ 3์ฅ์์ ๋ฆฌํฉํ ๋ง ์์
export class SearchAction {
actionType = "SEARCH";
constructor(readonly payload: {searchQuery: string}){}
}
export class SearchSuccessAction{[1]
actionType = 'SEARCH_SUCCESS';
constructor(public payload: {searchResults: string[] }){}
}
export class SearchFailedAction {
actionType = 'SEARCH_FAILED';
}
export type SearchActions = SearchAction | SearchSuccessAction | SearchFailedAction
์๋ณ ๊ฐ๋ฅํ ์ ๋์จ์ ๊ณตํต ํ๋กํผํฐ ์ฆ, ๊ณตํ ์ผ์ด ์๋ณ์๋ฅผ ๊ฐ์ง ๋ฉค๋ฒ๋ก ์ด๋ฃจ์ด์ง ํ์ ์ ๋งํจ.
๊ฐ ๋ฉค๋ฒ๋ง๋ค actionType์ด๋ผ๋ ์๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๋์จ ์๋ณ์ ํด๋นํจ.
// 2_23.ts
interface Rectangle {
kind: 'rectangle';
width: number;
height: number;
}
interface Circle {
kind: 'circle'; 1
radius: number;
}
type Shape = Rectangle | Circle; // union
kind๋ฅผ ๊ฐ์ง๊ณ ์์ด kind๊ฐ์ ๋ฐ๋ผ shpae ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
// 2_24.ts
function area(shape: Shape):number {
switch(shape.kind){
case 'rectangle': return shape.height * shape.width;
case 'circle': return Math.PI * shape.radius **2;
}
}
const myRectangle:Rectangle = {kind: 'rectangle', width:10, height: 20}
console.log(`Rectangle's area is ${area(myRectangle)}`);
const myCircle:Circle = {kind: 'circle', radius: 10};
console.log(`Circle's area is ${area(myCircle)}`);
inํค์๋๋ ํ์ ๋ฒ์๋ฅผ ์ถ์ํ๋ ํํ.
์ ๋์จ ํ์ ์ธ์๋ฅผ ๊ฐ์ง ํจ์๋ ํธ์ถํ๋ ๋์ ์ค์ ๊ฐ์ ์ฒดํฌํ ์ ์์ ๊ฒ์ด๋ค.
interface A { a: number };
interface B { b: string };
function foo(x: A|B){
if('a'in x){
return x.a;
}
return x.b;
}