Type Query(타입 쿼리)
Type Query(타입 쿼리)는 특정 타입(Type)을 가져오는 방법이다. 즉, 타입 쿼리를 사용하면 변수, 함수 또는 클래스 등에 대한 타입 정보를 가져올 수 있다.
타입 쿼리는 다음과 같은 두 가지 방법으로 사용할 수 있다.
typeof 연산자를 사용하여 변수 또는 함수의 타입 정보를 가져오기
예를 들어, 다음과 같은 코드가 있다고 가정해보자.
const person = { name: "John", age: 30 };
function getPersonInfo(person: { name: string; age: number }): void {
console.log(`${person.name} is ${person.age} years old`);
}
여기서 typeof 연산자를 사용하여 person 변수와 getPersonInfo 함수의 타입 정보를 가져올 수 있다.
type PersonType = typeof person; // { name: string, age: number }
type GetPersonInfoType = typeof getPersonInfo; // (person: { name: string; age: number }) => void
위의 예시에서, PersonType은 { name: string, age: number }와 같은 객체 타입(Object Type)이 되고, GetPersonInfoType은 (person: { name: string; age: number }) => void와 같은 함수 타입(Function Type)이 된다.
keyof 연산자를 사용하여 객체의 속성(Property) 이름을 가져오기
예를 들어, 다음과 같은 코드가 있다고 가정해보자.
type Person = {
name: string;
age: number;
location: string;
};
function getPersonInfo(person: Person, key: keyof Person): void {
console.log(`${key}: ${person[key]}`);
}
여기서 keyof 연산자를 사용하여 Person 타입의 속성 이름을 가져와서 getPersonInfo 함수의 key 매개변수의 타입으로 사용할 수 있다. 이렇게 하면 함수를 호출할 때 올바른 속성 이름을 전달하도록 보장할 수 있다.
const person: Person = { name: "John", age: 30, location: "New York" };
getPersonInfo(person, "name"); // "name: John"
getPersonInfo(person, "age"); // "age: 30"
getPersonInfo(person, "location"); // "location: New York"
또한, 타입 쿼리는 타입 정보를 가져오는 것이므로, 타입 선언(Type Declarations)과 관련이 있다.
예를 들어, 다음과 같이 외부 라이브러리에서 제공하는 타입 정보를 가져와 사용할 수 있다.
import { SomeType } from "some-library";
function someFunction(value: SomeType): void {
// do something
}
위의 코드에서 SomeType은 "some-library" 라이브러리에서 제공하는 타입으로, import 문을 사용하여 가져올 수 있다.
또한, 타입 쿼리는 코드 내에서 타입 정보를 조작하는 데 사용될 수도 있다. 예를 들어, 다음과 같은 코드가 있다고 가정해보자.
type Person = {
name: string;
age: number;
};
type PersonWithAddress = Person & { address: string };
function getPersonName(person: Person): string {
return person.name;
}
function getPersonNameWithAddress(person: PersonWithAddress): string {
return person.name;
}
여기서 getPersonName 함수와 getPersonNameWithAddress 함수는 모두 Person 타입의 name 속성을 반환한다. 하지만 getPersonNameWithAddress 함수는 PersonWithAddress 타입을 매개변수로 받으므로, 컴파일러는 getPersonNameWithAddress 함수의 반환 타입이 string임을 유추할 수 없다.
따라서 타입 쿼리를 사용하여 반환 타입을 추론하도록 지시할 수 있다.
function getPersonNameWithAddress(person: PersonWithAddress): typeof person.name {
return person.name;
}
위의 코드에서 typeof person.name은 PersonWithAddress 타입의 name 속성의 타입을 가져온다. 이렇게 함으로써 컴파일러는 getPersonNameWithAddress 함수의 반환 타입이 string임을 유추할 수 있다.
타입 쿼리는 일부 상황에서 유용하지만, 코드를 복잡하게 만들기도 한다. 따라서 타입 쿼리를 사용할 때는 코드의 가독성과 유지보수성을 고려해야 한다.
타입쿼리 사용 예시
타입 속성 가져오기
타입 쿼리를 사용하여 타입의 특정 속성을 가져올 수 있다. 아래 예시에서는 Person이라는 인터페이스에서 name 속성의 타입을 가져온다.
interface Person {
name: string;
age: number;
}
type PersonNameType = Person['name'];
// 위 코드는 string 타입을 반환합니다.
클래스 생성자 타입 가져오기
타입 쿼리를 사용하여 클래스 생성자의 타입을 가져올 수 있다. 아래 예시에서는 Person 클래스의 생성자 타입을 가져온다.
class Person {
constructor(public name: string, public age: number) {}
}
type PersonConstructorType = typeof Person;
// 위 코드는 Person 클래스의 생성자 타입을 반환합니다.
인터페이스를 구현한 클래스 타입 가져오기
타입 쿼리를 사용하여 인터페이스를 구현한 클래스의 타입을 가져올 수 있다. 아래 예시에서는 Person 인터페이스를 구현한 Employee 클래스의 타입을 가져온다.
interface Person {
name: string;
age: number;
}
class Employee implements Person {
constructor(public name: string, public age: number, public department: string) {}
}
type EmployeeType = typeof Employee;
// 위 코드는 Employee 클래스의 타입을 반환합니다.
모듈에서 타입 가져오기
타입 쿼리를 사용하여 다른 모듈에서 타입을 가져올 수 있다. 아래 예시에서는 myModule 모듈에서 Person 인터페이스의 타입을 가져온다.
// myModule.ts
export interface Person {
name: string;
age: number;
}
// app.ts
import type { Person } from './myModule';
type PersonType = typeof Person;
// 위 코드는 myModule 모듈에서 내보내진 Person 인터페이스의 타입을 반환합니다.