JavaScript에서 사용하는 조건부 연산자를 TypeScript 타입에서도 활용 가능합니다.
// JavaScript 삼항연산자
조건문 ? 참일때실행할코드 : 거짓일때실행할코드
3 > 1 ? console.log('맞아요') : console.log('아님')
type Age<T> = T extends string ? string : unknown;
let age: Age<string>; // string 타입
let age2: Age<number>; // unknown 타입
핵심: extends 키워드로 조건을 만들고, 삼항연산자로 결과 타입을 지정합니다.
type FirstItem<T> = T extends any[] ? T[0] : any;
let age1: FirstItem<string[]>; // string 타입
let age2: FirstItem<number>; // any 타입
조건부 타입에서 타입을 추출하여 변수로 사용할 수 있는 키워드입니다.
type Person<T> = T extends infer R ? R : unknown;
type 새타입 = Person<string>; // string 타입
type 타입추출<T> = T extends (infer R)[] ? R : unknown;
type NewType = 타입추출<boolean[]>; // boolean 타입
type 타입추출<T> = T extends (() => infer R) ? R : unknown;
type NewType = 타입추출<() => number>; // number 타입
참고: ReturnType<> 내장 타입으로도 함수의 return 타입 추출 가능합니다.
외부 JavaScript 파일의 변수를 TypeScript에서 사용할 때 타입 에러를 방지합니다.
// data.js
var a = 10;
var b = {name: 'kim'};
// index.ts
declare let a: number;
console.log(a + 1); // 에러 없이 사용 가능
특징:
declare가 붙은 코드는 JavaScript로 변환되지 않음TypeScript의 특별한 기능으로, import/export 없이도 같은 폴더의 타입을 전역으로 사용 가능합니다.
// data.ts
type Age = number;
let 나이: Age = 20;
// index.ts (import 없이 사용 가능)
console.log(나이 + 1); // 가능
let 철수: Age = 30; // 가능
// 로컬 모듈에서 전역 타입 선언
declare global {
type Dog = string;
}
// types.d.ts
export type Age = number;
export type multiply = (x: number, y: number) => number;
export interface Person { name: string }
// tsconfig.json
{
"compilerOptions": {
"declaration": true
}
}
이 설정으로 .ts 파일 저장 시 자동으로 .d.ts 파일이 생성됩니다.
npm install --save @types/jquery
클래스가 특정 인터페이스의 구조를 갖고 있는지 확인하는 키워드입니다.
interface CarType {
model: string;
price: number;
}
class Car implements CarType {
model: string;
price: number = 1000;
constructor(a: string) {
this.model = a;
}
}
class Car implements CarType {
model; // any 타입 (implements는 타입 할당 안함)
// ...
}
객체의 모든 속성에 대한 타입을 한 번에 지정하는 방법입니다.
interface StringOnly {
[key: string]: string;
}
let obj: StringOnly = {
name: 'kim',
age: '20', // 모든 값이 string이어야 함
location: 'seoul'
};
interface StringOnly {
age: string; // 특정 속성 지정
[key: string]: string; // 나머지 모든 속성
}
interface StringOnly {
[key: number]: string;
}
let obj: StringOnly = {
0: 'kim',
1: '20',
2: 'seoul'
};
중첩된 객체를 위한 재귀적 타입 정의입니다.
interface MyType {
'font-size': MyType | number;
}
let obj: MyType = {
'font-size': {
'font-size': {
'font-size': 14
}
}
};
객체 타입의 모든 키를 union type으로 추출합니다.
interface Person {
age: number;
name: string;
}
type PersonKeys = keyof Person; // "age" | "name"
기존 타입의 모든 속성을 다른 타입으로 변환하는 타입 변환기입니다.
type Car = {
color: boolean;
model: boolean;
price: boolean | number;
};
type TypeChanger<MyType> = {
[key in keyof MyType]: string;
};
type 새로운타입 = TypeChanger<Car>;
// { color: string; model: string; price: string; }
type TypeChanger<MyType, T> = {
[key in keyof MyType]: T;
};
type NewBus = TypeChanger<Bus, boolean>; // 모든 속성이 boolean
type NewBus2 = TypeChanger<Bus, string[]>; // 모든 속성이 string[]
type Age<T> = T extends [string, ...any] ? T[0] : unknown;
let age1: Age<[string, number]>; // string
let age2: Age<[boolean, number]>; // unknown
type 타입뽑기<T> = T extends (x: infer R) => any ? R : any;
type a = 타입뽑기<(x: number) => void>; // number
// 자동차 정보 타입
interface CarInfo {
[key: string]: string | number;
}
// 중첩 객체 타입
interface MyType {
'font-size': number;
[key: string]: number | MyType;
}
// Bus 타입 변환
type Bus = {
color: string;
model: boolean;
price: number;
};
type TypeChanger<MyType> = {
[key in keyof MyType]: string | number;
};
type NewBus = TypeChanger<Bus>;
extends와 삼항연산자, infer로 타입 추출declare로 타입 힌트, .d.ts로 타입 정의 파일[key: type]: type 문법, keyof와 in 연산자