본문으로 건너뛰기

단원 연습 문제

타입스크립트 목차기본 타입과 함수문제 12개

2단원 '기본 타입과 함수'의 여섯 레슨에서 아홉 문제를 내고, 1단원 '타입 검사기'에서 세 문제를 섞었습니다. 1단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 검사 결과는 지나가는지와 막히는 줄을, 실행 결과는 찍히는 글자를 종이에 끝까지 쓴 뒤 정답을 펼치세요. 실행이 오류로 멈추면 오류 이름이 든 줄까지만 써도 됩니다. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

한 번에 다 풀 필요는 없습니다. 문제 1~10은 폰으로도 풀 수 있고(약 30~40분), 끝의 만들어 보기 둘은 컴퓨터에서 tsc와 Node로 직접 검사하고 돌려 봅니다. 이 단원을 건너뛸지 보려면 진단 문항인 문제 1 · 2 · 4 · 6 · 7 · 9 여섯을 먼저 풀어 보세요(약 15분). 진단 문항은 힌트를 펴지 않고 풉니다. 힌트를 펴고 맞힌 문제나 짐작으로 맞힌 문제는 틀린 것으로 칩니다. 모두 맞으면 이 단원 레슨은 건너뛰고, 틀린 문제가 있으면 그 정답 끝의 레슨만 봅니다. 끝의 만들어 보기 둘은 골라서 풉니다.

끝의 두 문제는 프로그램을 직접 만들어 봅니다. 컴퓨터가 있으면 main.ts로 저장해 npx tsc로 검사 오류가 0인지 본 뒤 node main.ts로 돌려 맞춰 봅니다. 플레이그라운드에서는 맨 위에 export {}; 한 줄을 더합니다. 폰으로만 본다면 문제에 적힌 값으로 내 코드를 한 줄씩 검사하고 따라가 나와야 할 화면과 맞춰 봅니다. 검사 결과는 tsc 7.0.2로, 실행 결과는 Node 26으로 돌린 것입니다.

문제 1

도서관 대출 기록에 쓸 이름 다섯에 타입을 적었습니다. 검사를 지나갈까요? 지나가지 못하면 막히는 줄을 모두 쓰세요.

let title: string = '봄';
let pages: number = '120';
let lent: boolean = 'false';
let memo: string = null;
let fee: number = 0;
힌트

줄마다 오른쪽 값에 따옴표가 있는지, 그 값이 왼쪽에 적은 타입의 모음에 드는지 봅니다.

정답
검사 결과 오류 3개
main.ts(2,5): error TS2322: Type 'string' is not assignable to type 'number'.main.ts(3,5): error TS2322: Type 'string' is not assignable to type 'boolean'.main.ts(4,5): error TS2322: Type 'null' is not assignable to type 'string'.

2 · 3 · 4번 줄에서 막힙니다. 세 줄 모두 TS2322, 곧 받는 자리의 타입에 넣을 수 없는 값을 넣었다는 뜻입니다. 검사기는 오류를 찾아도 멈추지 않고 끝까지 읽어 셋을 모두 보입니다.

  • 2번 줄: '120'은 따옴표 안이라 글자입니다. number 자리에 글자 값을 넣었습니다.
  • 3번 줄: 'false'도 따옴표 안의 글자라 boolean 모음에 들지 않습니다. boolean에 드는 값은 true와 false 둘뿐입니다.
  • 4번 줄: null은 string 모음 밖입니다. 오류 문장의 'null'이 넣으려는 값의 타입입니다.
  • 1 · 5번 줄은 지나갑니다. 0도 number 모음의 값입니다.

흔한 오답은 4번 줄을 빼고 2 · 3번 줄만 쓴 것입니다. null은 어느 타입 자리에나 넣을 수 있다고 본 것입니다. 이 과목 설정(strict)에서 null은 null 모음에만 듭니다(검사 규칙 2). 3번 줄을 빼면 따옴표 안의 'false'를 참·거짓 값으로 본 것입니다.

다시 볼 레슨: 원시 타입과 null·undefined · 타입 적기와 넣을 수 있는지 검사

문제 2

지난 사흘 동안 달린 거리(km)를 배열에 모았습니다. 마지막 날 거리를 소수 한 자리로 찍으려 합니다. 검사 결과와 실행 결과를 각각 쓰세요.

const runs = [3, 5, 4];
const n = runs.length;
const last = runs[n];
console.log(last.toFixed(1));
힌트

3번 줄 last의 지금 타입과, 실행 때 runs[n]이 꺼내는 자리를 따로 봅니다.

정답
검사 결과 오류 없음
실행 결과
main.ts:4console.log(last.toFixed(1));                 ^ TypeError: Cannot read properties of undefined (reading 'toFixed')    at main.ts:4:18

검사는 오류 없이 지나갑니다. 검사기는 3번 줄 last의 지금 타입을 원소 타입 number로 봅니다. number 배열에서 몇 번째 자리를 꺼내든 number로 보기 때문입니다. 실행은 4번 줄에서 멈춥니다. n은 3이고 runs의 자리는 0 · 1 · 2라, runs[3]은 없는 자리의 undefined입니다. undefined에서 toFixed를 꺼내려다 TypeError가 납니다. 마지막 날은 runs[n - 1]로 꺼냅니다(4.0).

흔한 오답은 실행 결과를 4.0으로 쓴 것입니다. 검사를 지난 배열 꺼내기는 실행할 때도 값이 있다고 본 것입니다(꺼낸 값은 늘 있다는 생각). 검사기는 그 자리에 정말 값이 있는지 모릅니다(검사 규칙 2). 검사가 3번 줄에서 막힌다고 쓴 답은 검사기가 배열의 길이를 세어 본다고 본 것입니다. 검사기는 값을 셈하지 않고 타입만 봅니다(검사 규칙 1).

JS 다시 보기: 문자열 · 배열에 없는 자리를 꺼내면 오류 없이 undefined가 나옵니다(JS '인덱스와 자르기' · JS '배열과 이름 둘').

다시 볼 레슨: 배열과 튜플

문제 3

하루에 20쪽씩 5일 동안 읽으면 모두 몇 쪽인지 셈하는 함수입니다. 100이 찍히기를 바랐습니다. 검사 결과와 실행 결과를 각각 쓰세요.

function pages(
  per: number,
  days: number,
) {
  return per + days;
}
const daily: number = '20';
console.log(pages(daily, 5));

다 썼으면 7번 줄을 const daily = 20;으로 고쳤을 때의 검사 결과와 실행 결과도 쓰세요.

힌트

7번 줄에서 daily가 붙는 값과 daily의 선언 타입을 견줘 봅니다. 5번 줄에서는 per와 days를 어떤 연산자로 잇는지 봅니다.

정답
검사 결과 오류 1개
main.ts(7,7): error TS2322: Type 'string' is not assignable to type 'number'.
실행 결과
205

검사는 7번 줄에서 막힙니다. daily의 선언 타입은 적은 number인데 글자 값 '20'을 넣으려 했습니다. 이 TS2322는 number 자리에 글자 값을 넣었다는 뜻입니다. Node는 타입 글자를 지우고 돌립니다. daily는 글자 '20'에 붙고, 5번 줄 '20' + 5에서 +가 5를 이어 붙여 205를 찍습니다.

7번 줄을 고치면 이렇습니다.

function pages(
  per: number,
  days: number,
) {
  return per + days;
}
const daily = 20;
console.log(pages(daily, 5));
검사 결과 오류 없음
실행 결과
25

검사 오류는 0이지만 100이 아니라 25가 찍힙니다. 5번 줄이 per와 days를 곱하지 않고 더해 20 + 5입니다. 100이 되려면 5번 줄을 return per * days;로 고쳐야 합니다. 검사기는 두 매개변수가 number인지만 볼 뿐, 더할지 곱할지는 모릅니다(검사 규칙 1).

흔한 오답 둘은 처음 코드의 실행 결과에서 나옵니다.

  • '아무것도 찍지 않는다' — 검사 오류가 있으면 Node가 돌지 않는다고 본 것입니다(검사 오류가 실행을 막는다는 생각).
  • 25 — 7번 줄에 number를 적었으니 '20'이 수 20으로 바뀐다고 본 것입니다(타입이 실행 때 남는다는 생각).

Node는 검사하지 않고 타입 글자만 지워 돌아, 값을 막지도 바꾸지도 않습니다(검사 규칙 1). 다른 흔한 오답은 고친 뒤의 실행 결과를 100으로 쓴 것입니다. 검사를 지나면 뜻대로 돈다고 본 것입니다(검사를 지나면 맞다는 생각). 검사를 지난 뒤에도 작은 값으로 돌려 손으로 셈한 값과 맞춰 봅니다.

JS 다시 보기: +는 한쪽이 글자면 둘을 이어 붙여 글자를 만듭니다(JS '수·글자·불리언과 typeof').

다시 볼 레슨: 타입 검사기가 하는 일 · 타입은 실행 전에 지워진다 · 함수의 입력과 출력

문제 4

카페 스탬프를 하나 더해 주는 함수입니다. 검사를 지나갈까요? 지나가지 못하면 막히는 줄을 모두 쓰세요. Node로 돌리면 무엇이 찍힐까요?

function nextStamp(count) {
  return count + 1;
}
const now = nextStamp(9);
console.log(now);
힌트

검사기가 1번 줄 count의 타입을 어디서 알 수 있을지 봅니다.

정답
검사 결과 오류 1개
main.ts(1,20): error TS7006: Parameter 'count' implicitly has an 'any' type.
실행 결과
10

검사는 1번 줄에서 막힙니다. 이 TS7006은 매개변수 count의 타입이 정해지지 않아 any가 됐다는 뜻입니다. 매개변수의 타입은 부르는 줄의 인자에서 추론되지 않아, 매개변수에는 타입을 적습니다(검사 규칙 3). Node는 타입과 상관없이 돌아 9 + 1인 10을 찍습니다.

흔한 오답은 '지나감'입니다. 4번 줄에서 9를 넘기니 count도 number로 정해진다고 본 것입니다(매개변수도 추론된다는 생각). 1번 줄의 매개변수를 count: number로 적으면 검사를 지납니다.

다시 볼 레슨: 함수의 입력과 출력

문제 5

아침까지 걸은 9000걸음에 저녁에 걸은 2500걸음을 더해 11500을 찍으려는 코드입니다. 검사에서 막힙니다.

function total(steps: number) {
  return steps + 2500;
}
let morning = '9000';
console.log(total(morning));
검사 결과 오류 1개
main.ts(5,19): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

아래 고치기 가운데 검사 오류를 없애는 것을 모두 고르세요. 그 가운데 실행 결과까지 11500이 되는 것도 모두 고르세요.

  • ① 4번 줄을 let morning = 9000;으로 고친다
  • ② 1번 줄을 function total(steps: any) {⁠로 고친다
  • ③ 1번 줄을 function total(steps: string) {⁠으로 고친다
  • ④ 5번 줄을 console.log(total(Number(morning)));⁠으로 고친다
힌트

보기마다 고친 코드를 Node가 돌린다고 보고, 2번 줄의 + 양쪽에 오는 값이 무엇인지 따라가 봅니다.

정답

검사 오류를 없애는 것은 ①②③④ 넷 모두이고, 실행 결과까지 11500이 되는 것은 ①과 ④입니다. 이 과목이 권하는 고치기는 ①입니다.

function total(
  steps: number,
) {
  return steps + 2500;
}
let morning = 9000;
console.log(total(morning));
실행 결과
11500

①로 고친 코드입니다(정답 접기 안은 폭이 좁아 함수 머리를 나눴습니다). 오류는 5번 줄에서 났지만 까닭은 4번 줄입니다. morning이 글자 '9000'에 붙어, 넘기는 줄에서 number 매개변수에 글자를 넣게 되었습니다. 값을 처음 만드는 줄을 수로 고칩니다.

  • ④도 맞는 고치기입니다. Number(morning)이 글자 '9000'을 수 9000으로 바꿔 넘깁니다. 바깥에서 글자로 받은 값이라면 이 꼴로 바꿉니다.
  • ②는 덮는 길입니다. any는 검사를 끄는 타입이라 오류만 사라지고, 값은 그대로 글자라 이어 붙습니다.
function total(steps: any) {
  return steps + 2500;
}
let morning = '9000';
console.log(total(morning));
실행 결과
90002500
  • ③도 검사는 지나지만 같은 90002500을 찍습니다. 받는 쪽을 틀린 값에 맞춰 타입을 바꿨을 뿐, 글자와 수를 잇는 실수는 그대로입니다.

흔한 오답은 ②나 ③까지 11500 쪽에 고른 것입니다. 검사 오류가 사라지면 실수도 고쳐진 것이라고 본 것입니다(검사를 지나면 맞다는 생각). 덮는 길과 받는 타입 바꾸기는 검사 결과에서 오류만 지우고 값과 실행 결과는 그대로 둡니다.

JS 다시 보기: +는 한쪽이 글자면 둘을 이어 붙여 글자를 만듭니다(JS '수·글자·불리언과 typeof').

다시 볼 레슨: 함수의 입력과 출력 · 타입 오류 읽기

문제 6

음료 한 잔을 주문하는 함수입니다. 6번 줄에서 shot과 memo의 지금 타입은 무엇일까요? Node로 돌리면 무엇이 찍힐까요?

function drink(
  size: string,
  shot = 1,
  memo?: string,
) {
  console.log(size, shot, memo);
}
drink('tall');
힌트

3번 줄과 4번 줄은 둘 다 비워도 되는 매개변수입니다. 비웠을 때 함수 안에 무엇이 오는지 하나씩 봅니다.

정답

shot의 지금 타입은 number, memo의 지금 타입은 string | undefined입니다.

실행 결과
tall 1 undefined
  • shot은 기본값 1에서 타입이 number로 정해집니다. 비우면 1이 쓰이니 undefined가 더해지지 않습니다.
  • memo는 ?를 붙인 선택 매개변수라 선언 타입 string에 undefined가 더해집니다. 8번 줄처럼 비우면 실행 때 정말 undefined가 옵니다(검사 규칙 2).
  • Node는 비운 shot에 기본값 1을, 비운 memo에 undefined를 붙여 tall 1 undefined를 찍습니다.

같은 답으로 치는 꼴: memo를 undefined | string처럼 차례만 바꿔 쓴 것.

흔한 오답은 memo를 string으로 쓴 것입니다. 선택 매개변수도 함수 안에서는 늘 값이 있다고 본 것입니다(꺼낸 값은 늘 있다는 생각). shot을 number | undefined로 쓰면 기본값 매개변수에도 ?처럼 undefined가 더해진다고 본 것입니다. 기본값이 있으면 비워도 값이 있습니다.

다시 볼 레슨: 선택·기본값 매개변수

문제 7

주문마다 잔 수에 '잔'을 붙인 글을 만듭니다. 4번 줄에서 tags의 지금 타입은 무엇일까요? Node로 돌리면 무엇이 찍힐까요?

const cups = [2, 1, 3];
const tags = cups
  .map((c) => c + '잔');
console.log(tags);
힌트

3번 줄의 콜백이 원소 하나마다 돌려주는 값이 무엇인지 봅니다.

정답

tags의 지금 타입은 string[]입니다.

실행 결과
[ '2잔', '1잔', '3잔' ]
  • 3번 줄: map이 받는 콜백 자리에서 c의 타입이 cups의 원소 타입 number로 정해집니다(문맥에서 추론 — 검사 규칙 3). c + '잔'은 수와 글자를 이어 string입니다.
  • map은 콜백이 돌려준 값들로 새 배열을 만드니 tags는 string[]입니다.
  • Node는 글자 원소를 작은따옴표로 감싸 찍습니다.

흔한 오답은 number[]입니다. map이 만든 배열도 원래 배열의 원소 타입을 그대로 가진다고 본 것입니다. 새 배열의 원소 타입은 콜백이 돌려주는 값의 타입입니다.

JS 다시 보기: map은 원소마다 콜백을 불러 돌려받은 값으로 새 배열을 만듭니다(JS 'map·filter·find').

다시 볼 레슨: 함수 타입과 콜백

문제 8

주문 정보에 쓸 이름 셋입니다. 4 · 5번 줄에서 menu · shot · cup.size의 지금 타입을 하나씩 쓰세요.

let menu = '녹차';
const shot = 2;
const cup = { size: 'grande' };
console.log(menu, shot);
console.log(cup.size);
힌트

4 · 5번 줄에서 읽는 세 이름이 각각 몇 번 줄에서 무엇으로 만들어졌는지 봅니다.

힌트 둘

let으로 만든 이름 · const로 만든 수 하나 · const로 만든 객체의 속성을 가릅니다.

정답
검사 결과 오류 없음

검사 오류 없이 지나가고, 4 · 5번 줄의 지금 타입은 이렇습니다.

이름지금 타입
menustring
shot2
cup.sizestring
  • menu는 let으로 만들어 첫 값 '녹차'를 넓힌 string입니다.
  • shot은 const로 만든 수 하나라 그 값 하나짜리 타입 2입니다.
  • cup.size는 const로 만든 객체의 속성이지만 string입니다. const 이름은 다시 붙일 수 없어도 객체의 속성은 다른 값에 다시 붙일 수 있어, 검사기가 넓혀 둡니다(검사 규칙 3).

흔한 오답은 cup.size를 "grande"로 쓴 것입니다. const로 만든 객체라 속성도 그 값 하나라고 본 것입니다(넓어지지 않는다는 생각). menu를 "녹차"로 쓰면 let도 그 값 하나라고 본 것이고, shot을 number로 쓰면 const도 넓힌다고 본 것입니다.

다시 볼 레슨: 적지 않아도 붙는 타입 — 추론

문제 9

하고 싶은 일마다 쓸 타입이나 기호, 매개변수를 쓰세요.

  • (가) 수만 담는 배열의 타입
  • (나) 부를 때 비워도 되는 매개변수의 이름 뒤에 붙이는 기호
  • (다) 남은 수 인자를 모두 배열 하나 prices로 받는 매개변수 — 이름과 타입까지
  • (라) 첫 칸은 글자, 둘째 칸은 수로 정해진 두 칸짜리 배열의 타입
힌트

(가)와 (라)는 둘 다 배열이지만, (라)는 칸 수와 칸마다의 타입이 정해져 있습니다.

정답

받는 답: (가) number[] · (나) ? · (다) ...prices: number[] · (라) [string, number]

같은 답으로 치는 꼴:

  • (가) · (다) 7단원에서 볼 Array<number>도 같은 타입입니다(...prices: Array<number>).

틀리는 꼴:

  • (가) Number[] — 대문자 Number는 number와 다른 타입이라, 꺼낸 값을 셈하는 줄에서 검사가 막힙니다(TS2365). [number]는 수 한 칸짜리 튜플입니다.
  • (나) 기본값(qty = 1)도 비워도 되는 매개변수를 만들지만, 기호가 아니라 값이고 비우면 그 값이 쓰입니다.
  • (다) ...prices: number — 모은 배열이 아니라 인자 하나의 타입을 적은 것입니다. 나머지 매개변수에 배열이 아닌 타입을 적으면 함수 머리가 TS2370으로 막힙니다. ... 기호를 뺀 prices: number[]은 배열 하나를 인자 하나로 받는 매개변수라, 수를 둘 넘겨 부르면 TS2554로 막힙니다.
  • (라) 글자와 수가 섞인 배열 리터럴에서 추론되는 타입은 칸 수와 차례를 정하지 않아 튜플이 아닙니다. [String, Number]는 대문자라 다른 타입입니다.

다시 볼 레슨: 배열과 튜플 · 선택·기본값 매개변수 · 나머지 매개변수

문제 10

라테 두 잔 값에 쿠키 2000원을 더해 11000을 찍으려 합니다. 검사에서 이렇게 막혔습니다. 몇 번 줄의 무엇을 고쳐야 할까요? 고친 줄을 쓰세요.

function price(
  qty: number,
) {
  return qty * 4500 + '원';
}
const sum: number = price(2);
console.log(sum + 2000);
검사 결과 오류 1개
main.ts(6,7): error TS2322: Type 'string' is not assignable to type 'number'.
힌트

6번 줄 오른쪽 price(2)가 돌려주는 값의 타입이 몇 번 줄에서 정해지는지 거슬러 봅니다.

정답

4번 줄을 return qty * 4500;으로 고칩니다.

function price(
  qty: number,
) {
  return qty * 4500;
}
const sum: number = price(2);
console.log(sum + 2000);
실행 결과
11000

오류는 6번 줄에서 났지만 까닭은 4번 줄입니다. price가 돌려주는 타입은 return에서 정해지는데, 4번 줄이 수 9000에 '원'을 이어 붙여 글자를 돌려줍니다. 그래서 6번 줄에서 number 자리에 글자 값을 넣게 되었습니다. 4번 줄이 수를 돌려주게 고치면 6번 줄 오류도 사라지고 11000이 찍힙니다. 다른 줄만 고쳐서는 11000이 나오지 않습니다.

흔한 오답은 오류가 난 6번 줄에서 : number를 지우는 것입니다. 검사 오류는 사라지지만 sum이 글자 '9000원'에 붙어 7번 줄이 이어 붙입니다.

function price(
  qty: number,
) {
  return qty * 4500 + '원';
}
const sum = price(2);
console.log(sum + 2000);
실행 결과
9000원2000

오류가 난 줄을 고칠 줄로 본 것입니다(오류 줄이 고칠 줄이라는 생각). 검사를 지났어도 결과는 틀립니다(검사를 지나면 맞다는 생각). 오류의 자리에서 그 값의 타입이 정해진 줄로 거슬러 갑니다.

다시 볼 레슨: 함수의 입력과 출력 · 타입 오류 읽기

문제 11 (만들어 보기)

주문 금액 함수 cost를 만들어 봅니다. cost는 잔 수와 한 잔 값을 받아 금액을 돌려주고, 한 잔 값을 비우면 4500으로 셈합니다. 아래 뼈대로 돌리면 이렇게 나와야 합니다.

9000
3500

뼈대의 4 · 5번 줄은 이미 있습니다. 주석 '1. 함수 머리'와 '2. 금액 돌려주기' 아래를 채우세요. 검사 오류는 0이어야 하고, cost('2')처럼 글자를 넘기는 줄은 검사에서 막혀야 합니다.

// 1. 함수 머리
// 2. 금액 돌려주기
// 3. 찍기
console.log(cost(2));
console.log(cost(1, 3500));

다 쓰면 4번 줄의 cost(2)를 cost(3)으로 바꿔 따라가 봅니다. 첫 줄이 13500이어야 합니다.

힌트

함수 머리에 매개변수 둘(잔 수 · 한 잔 값)을 차례로 둡니다. 부를 때 비워도 되는 쪽은 둘째입니다.

정답

모범 답입니다.

// 1. 함수 머리
function cost(
  qty: number,
  unit = 4500,
) {
  // 2. 금액 돌려주기
  return qty * unit;
}
// 3. 찍기
console.log(cost(2));
console.log(cost(1, 3500));
실행 결과
9000
3500

cost(3)으로 바꾸면 qty가 3, unit이 기본값 4500이라 13500입니다. 글자를 넘기면 이렇게 막힙니다.

function cost(
  qty: number,
  unit = 4500,
) {
  return qty * unit;
}
console.log(cost('2'));
검사 결과 오류 1개
main.ts(7,18): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
  • 다르게 써도 되는 곳: unit: number = 4500처럼 타입과 기본값을 함께 적어도 같습니다. 돌려주는 타입을 ): number {로 적어도 됩니다. 이름은 달라도 됩니다.
  • 검사 오류가 0이고, 찍은 화면이 위와 같고, cost(3)도 13500이면 맞습니다.
  • 흔한 오답 하나는 한 잔 값을 unit?: number로 쓴 것입니다. 비워도 되지만 비우면 unit이 undefined라, '2. 금액 돌려주기'의 곱하기가 검사에서 막히고 실행은 NaN을 찍습니다(꺼낸 값은 늘 있다는 생각).
function cost(
  qty: number,
  unit?: number,
) {
  return qty * unit;
}
console.log(cost(2));
검사 결과 오류 1개
main.ts(5,16): error TS18048: 'unit' is possibly 'undefined'.
실행 결과
NaN
  • 다른 흔한 오답은 qty에 타입을 적지 않은 것입니다(qty,). 부르는 줄의 2에서 추론된다고 본 것입니다(매개변수도 추론된다는 생각). 그러면 TS7006으로 막힙니다.

다시 볼 레슨: 함수의 입력과 출력 · 선택·기본값 매개변수

문제 12 (만들어 보기)

이번에는 빈 데서 씁니다. 라테 두 잔(한 잔 4500원)의 주문 금액과, 거기에 팁 500원을 더한 합계를 찍는 프로그램을 쓰세요. 팁은 금액 하나를 받아 500을 더해 돌려주는 함수 addTip이 더하고, 주문 금액은 잔 수와 한 잔 값으로 프로그램이 셈하게 합니다. 검사 오류는 0이어야 하고, 이렇게 나와야 합니다.

주문 9000원
합계 9500원

다 쓰면 내 코드에서 잔 수가 적힌 한 곳만 3으로 바꿔 따라가 봅니다. 주문 13500원과 합계 14000원이 나와야 합니다.

힌트

하위 목표 셋의 주석(1. 값 두기 · 2. 팁 더하는 함수 · 3. 계산하고 찍기)을 먼저 쓰고, 그 아래를 채웁니다.

정답

모범 답입니다.

// 1. 값 두기
const qty = 2;
const unit = 4500;
// 2. 팁 더하는 함수
function addTip(
  price: number,
) {
  return price + 500;
}
// 3. 계산하고 찍기
const cost = qty * unit;
const sum = addTip(cost);
console.log(`주문 ${cost}원`);
console.log(`합계 ${sum}원`);
실행 결과
주문 9000원
합계 9500원

qty를 3으로 바꾸면 cost가 13500, sum이 14000이 됩니다.

  • 다르게 써도 되는 곳: const qty: number = 2;⁠처럼 타입을 적어도 됩니다(적지 않아도 첫 값에서 number로 정해집니다). 찍는 줄은 console.log('주문', cost + '원');⁠처럼 써도 같은 줄이 찍힙니다. 함수 머리는 한 줄로 써도 됩니다.
  • 검사 오류가 0이고, 찍은 화면이 위와 같고, 잔 수를 3으로 바꾼 결과도 맞으면 맞습니다. 잔 수를 바꿔도 결과가 그대로라면 9000처럼 손으로 셈한 값을 적은 것입니다. 셈은 프로그램에 맡깁니다.
  • 흔한 오답은 addTip의 매개변수에 타입을 적지 않은 것입니다(price만). 넘기는 금액이 수이니 추론된다고 본 것입니다(매개변수도 추론된다는 생각). 실행 결과는 같아도 검사가 TS7006으로 막힙니다.
function addTip(price) {
  return price + 500;
}
console.log(addTip(9000));
검사 결과 오류 1개
main.ts(1,17): error TS7006: Parameter 'price' implicitly has an 'any' type.

다시 볼 레슨: 타입 적기와 넣을 수 있는지 검사 · 타입 오류 읽기 · 함수의 입력과 출력

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

타입스크립트 목차로