TS LAB
TS 4.3 · 4부. 실무 준비

타입 정의 파일

d.ts 가 무엇인지, 남이 만든 코드의 타입을 어디서 받는지 봅니다.

예상 학습 시간 15분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 중급
개념 설명

타입만 적어 둔 파일

console.logDate 는 우리가 적어 둔 적이 없는데도 타입이 있습니다. 어딘가에 적혀 있기 때문입니다.

.d.ts 파일이 그것입니다. 실행되는 코드는 없고 모양만 적어 둔 파일입니다.

lib.es5.d.ts (일부)
interface DateConstructor {
	new(): Date;
	new(value: number | string): Date;
	parse(s: string): number;
}

declare var Date: DateConstructor;

declare"이런 것이 이미 있다" 고 알리는 것입니다. 만드는 것이 아니라 알리기만 합니다.

최소 예제 · 편집 가능

적어 둔 것이 검사에 쓰입니다

main.ts
const now = new Date(2026, 8, 1);

console.log(now.getFullYear());
console.log(now.toISOString().slice(0, 10));

console.log(now.getFullYear(1));
출력
6:29 TS2554 0개의 인수가 필요한데 1개를 가져왔습니다.

getFullYear 가 인수를 받지 않는다는 것을 lib.es5.d.ts 에 그렇게 적혀 있어서 압니다. 마지막 줄을 지우면 2026 과 날짜가 나옵니다.

상세 사용법

화면 요소의 타입

querySelectorElement 를 돌려줍니다. 어떤 태그인지까지는 모릅니다. 그래서 입력 칸의 value 를 읽으려 하면 막힙니다.

main.ts
const input = document.querySelector("#name");

if (input !== null) {
	console.log(input.value);
}
출력
4:20 TS2339 'Element' 형식에 'value' 속성이 없습니다.

null 은 확인했는데도 막혔습니다. 이번에는 없을 수 있어서가 아니라 무슨 요소인지 모르기 때문입니다.

main.ts
const input = document.querySelector("#name") as HTMLInputElement | null;

if (input !== null) {
	console.log(input.value);
}
출력
홍길동

as무슨 요소인지 알려 준 것입니다. 4.2 에서 as 를 조심하라고 했는데, 여기가 그것이 맞는 자리 가운데 하나입니다 — 마크업을 내가 적었으니 무엇인지 아는 것은 나뿐입니다.

| null 을 함께 둔 것을 눈여겨보세요. 이것을 빼면 없을 수 있다는 것까지 함께 우기게 됩니다.

상세 사용법

남이 만든 코드의 타입

npm 으로 받은 라이브러리의 타입은 세 가지 가운데 하나입니다.

경우어떻게 하나
함께 들어 있음아무것도 안 해도 됩니다. 요즘 라이브러리 대부분이 그렇습니다
따로 나와 있음npm i -D @types/이름 으로 받습니다
없음직접 .d.ts 를 적습니다
types/some-lib.d.ts
// 타입이 없는 라이브러리를 쓸 때 최소한으로 적어 두는 모양입니다.
declare module "some-lib" {
	export function greet(name: string): string;
}

전부 적을 필요는 없습니다. 실제로 사용하는 것만 적어 두면 그만큼 검사됩니다.

흔한 실수

처음에 자주 걸리는 것

as 로 없는 것까지 우기는 것

as HTMLInputElement 라고만 적으면 null 일 수 있다는 것까지 사라집니다. 요소가 없으면 Cannot read properties of null 로 터집니다.

@types 를 dependencies 에 넣는 것

타입은 실행에 필요하지 않습니다. devDependencies(-D)에 넣습니다.

.d.ts 에 실행되는 코드를 적는 것

.d.ts모양만 적는 파일입니다. 함수 본문을 적으면 오류입니다.

실습 문제

직접 해보기

1. 버튼 다루기 난이도 중

#save 단추를 찾아 눌리지 않게 만드세요 (disabled).

const save = document.querySelector("#save") as HTMLButtonElement | null;

if (save !== null) {
	save.disabled = true;
	console.log(save.disabled);
}
else {
	console.log("단추가 없습니다");
}
2. 적혀 있는 것 읽어 보기 난이도 하

편집기에서 Arraymap 위에 커서를 두고 정의로 가 보세요 (VS Code 는 F12). lib.es5.d.ts 가 열립니다.

map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; 로 적혀 있습니다. 3.3 의 제네릭이 그대로 보입니다 — 넣은 것(T)과 돌려주는 것(U)이 다를 수 있다는 것까지 적혀 있습니다.
요약

이 단원의 정리

  • .d.ts 는 실행되는 코드 없이 모양만 적어 둔 파일입니다.
  • declare 는 "이런 것이 이미 있다" 고 알립니다.
  • querySelector 는 무슨 요소인지 모릅니다. as 로 알려 줍니다.
  • as 를 쓸 때 | null 을 빠뜨리지 않습니다.
  • 라이브러리 타입은 함께 들어 있거나, @types 로 받거나, 직접 적습니다.