이번 시간에는 타입의 import, export 와 namespace 에 대해 알아보겠습니다.
우선, 타입도 import 와 export 가 가능합니다.
// a.ts
export type Name = string;
//index.ts
import { Name } from "./a";
let practice: Name = "park";
옛날에는 import 와 export 문법이 없어서 다른 파일의 내용을 가져오려면 <script>
태그로 첨부했는데, 이러다보니 변수명이 겹치는 경우가 많았습니다. 그래서 함수로 싸매는 등 방법이 있었으나, typescript 초창기에는 namespace 라는 것을 사용했습니다. Object 와 유사하게 사용되는데, 다른 파일에서 사용할 때는 reference 라는 구문을 선언함으로써 사용할 수 있었습니다.
//a.ts
namespace practice {
export type Name = string | number;
}
let temp: practice.Name = "kim";
//index.ts
///<reference path="./a.ts" />
let practice: practice.Name = "park";
참고로 module 도 namespace 와 같은 키워드인데, 예전 버전에서 사용하던 것이라고 알아두면 좋습니다.
//a.ts
module practice {
export type Name = string | number;
}
let temp: practice.Name = "kim";
연습으로 Car 와 Bike 타입을 만들었는데, 너무 길어서 다른 파일로 옮긴다고 가정해봅시다. 다른 파일은 아무데나 저장한 후, index.ts 에서 가져와 변수를 만들 때 사용해봅시다.
type Car = {
wheel: number;
model: string;
};
interface Bike {
wheel: 2;
model: string;
}
//a.ts
export type Car = {
wheel: number;
model: string;
};
export interface Bike {
wheel: 2;
model: string;
}
//index.ts
import { Car, Bike } from "./a";
const car: Car = {
wheel: 4,
model: "bmw",
};
const bike: Bike = {
wheel: 2,
model: "deliver",
};
이 함수는 파라미터로 object 자료 하나를 선택적으로 집어넣을 수 있고, 아무것도 return 하지 않습니다.
함수를 만들 때마다 타입을 일일이 붙이기 귀찮을 때, 타입을 다른 파일에 저장해두고 import 해서 사용할 수 있도록 하려면 어떻게 해야 할까요?
//a.ts
export type ObjFunction = (a?: object) => void;
//index.ts
import { ObjFunction } from "./a";
let practice: ObjFunction = function (a) {
console.log(a);
};
practice({ abc: "hi" });
마지막으로, 타입 중복이 너무 많이 발생하는 아래 코드의 에러를 없애야하는데, 어떻게 코드를 짜야할까요? (type Dog, interface Dog 의 타입이름 변경과 파일 분할은 금지.)
type Dog = string;
interface Dog {
name: string;
}
let dog1: Dog = "bark";
let dog2: Dpg = { name: "paw" };
namespace GoodDog {
export type Dog = string;
}
namespace BadDog {
export interface Dog {
name: string;
}
}
let dog1: GoodDog.Dog = "bark";
let dog2: BadDog.Dog = { name: "paw" };
지금까지 타입의 import, export 와 namespace 에 대해 알아보았습니다. 다음 시간에는 타입을 파라미터로 입력하는 Generic 에 대해 알아보겠습니다.