Menu

TypeScript 문자열: 템플릿 리터럴, 여러 줄 문자열, includes

TypeScript에서 문자열 다루기: 템플릿 리터럴로 문자열 보간하기, 여러 줄 문자열, 문자열에 특정 문자열이 포함됐는지 확인하기, 자주 쓰는 메서드와 반환 타입, 문자열 리터럴 타입.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

TypeScript 문자열은 string 타입을 가진 JavaScript 문자열입니다. 보간하려면 템플릿 리터럴, 즉 백틱과 ${expression} 자리표시자를 씁니다. 작은따옴표와 큰따옴표는 보간 없는 일반 문자열을 만듭니다.

세 가지 따옴표는 모두 같은 타입 string을 만듭니다. $${...}의 첫 번째 $는 그냥 달러 기호이고, 자리표시자를 시작하는 것은 ${뿐입니다.

문자열 보간(Interpolation)

${ } 안에는 변수, 산술식, 함수 호출, 삼항 연산자, 중첩된 템플릿 리터럴을 넣을 수 있습니다. 값은 String(value)와 같은 방식으로 문자열로 변환됩니다(symbol은 예외입니다. 보간하면 컴파일 오류 TS2731이고 런타임에는 TypeError를 던지므로 String(sym)으로 쓰세요).

객체를 보간하면 [object Object]가 출력되는데, 원하는 결과인 경우는 거의 없습니다. 필드를 골라 쓰거나 JSON.stringify(obj)를 사용하세요.

여러 줄 문자열

템플릿 리터럴은 여러 줄에 걸쳐 쓸 수 있습니다. 백틱 사이의 모든 것이 문자열의 일부이므로 줄바꿈도, 각 줄 앞의 들여쓰기도 그대로 남습니다.

코드의 들여쓰기가 문자열에 섞여 들어갈 때는 배열과 join("\n")으로 만들거나, 템플릿 리터럴의 줄을 줄 맨 앞에 붙여 쓰세요.

문자열에 특정 문자열이 포함됐는지 확인하기

includes는 "포함하는가"에 boolean으로 답합니다. startsWith와 endsWith는 앞뒤 끝을 확인합니다. indexOf는 위치를 반환하고, 찾는 문자열이 없으면 -1을 반환합니다. 모두 대소문자를 구분합니다.

includes는 시작 위치도 받습니다. file.includes("R", 1)은 인덱스 1부터만 찾습니다.

자주 쓰는 메서드와 반환 타입

TypeScript는 모든 내장 메서드의 반환 타입을 알고 있습니다. 주의할 것은 빈 결과를 돌려줄 수 있는 메서드입니다. strict에서는 결과를 쓰기 전에 null이나 undefined를 처리해야 하기 때문입니다.

메서드반환예
includes, startsWith, endsWithboolean"abc".includes("b")는 true
indexOf, lastIndexOfnumber(없으면 -1)"abc".indexOf("c")는 2
slice, substringstring"hello".slice(1, 3)은 "el"
splitstring[]"a,b".split(",")는 ["a", "b"]
trim, trimStart, trimEndstring" x ".trim()은 "x"
toUpperCase, toLowerCasestring"Ts".toUpperCase()는 "TS"
padStart, padEndstring"7".padStart(3, "0")은 "007"
replace, replaceAllstring"a-b-c".replaceAll("-", "")는 "abc"
repeatstring"ab".repeat(2)는 "abab"
atstring | undefined"abc".at(-1)은 "c"
matchRegExpMatchArray | null"a1".match(/\d/)
length(프로퍼티)number"abc".length는 3

일반 인덱싱 s[5]는 인덱스가 끝을 넘어도(런타임 값은 undefined) 타입이 string입니다. 컴파일러 옵션 noUncheckedIndexedAccess를 켜면 string | undefined가 됩니다.

문자열은 불변(immutable)이다

문자열의 글자를 제자리에서 바꿀 수 없습니다. TypeScript는 인덱스에 대입하는 코드를 TS2542 오류(Index signature in type 'String' only permits reading.)로 보고하며, 컴파일 결과인 strict 모드 JavaScript에서도 같은 대입은 런타임에 TypeError를 던집니다. 문자열을 바꾸는 것처럼 보이는 메서드는 모두 새 문자열을 반환합니다.

다른 값을 문자열로, 또는 문자열을 숫자로 바꾸는 방법은 문자열을 숫자로 변환을 참고하세요.

문자열 리터럴 타입

string은 어떤 텍스트든 받습니다. 문자열 리터럴 타입은 정확히 한 값만 받으며, 이들의 유니언은 허용되는 문자열의 enum 같은 집합을 만듭니다.

리터럴 타입은 컴파일할 때만 검사됩니다. 런타임에는 label("deleted")도 실행되어 Post is deleted를 출력하며, 여기서 두 번째 줄이 바로 그렇게 동작합니다. 템플릿 리터럴 문법은 타입 수준에서도 쓸 수 있습니다. type EventName = `on${string}`은 on으로 시작하는 모든 문자열을 받습니다.

자주 묻는 질문

TypeScript에서 문자열 보간은 어떻게 하나요?

템플릿 리터럴을 씁니다. 백틱 안에 ${expression} 자리표시자를 넣는 방식으로, `Hello, ${name}!`처럼 씁니다. 중괄호 안에는 어떤 식이든 들어갈 수 있고 결과의 타입은 string입니다. 작은따옴표와 큰따옴표는 보간하지 않습니다.

TypeScript에서 여러 줄 문자열은 어떻게 쓰나요?

텍스트를 백틱으로 감싸고 소스에서 줄을 바꾸면 됩니다. 템플릿 리터럴은 줄바꿈과 각 줄 앞의 들여쓰기까지 그대로 유지합니다. 아니면 줄 배열을 .join("\n")으로 합치거나, 일반 문자열 안에 \n을 씁니다.

TypeScript에서 문자열에 특정 문자열이 포함됐는지 어떻게 확인하나요?

text.includes("part")를 호출하면 boolean을 반환합니다. 대소문자를 구분하므로, 구분 없이 확인하려면 소문자로 바꾼 문자열끼리 비교합니다: text.toLowerCase().includes(part.toLowerCase()). startsWith와 endsWith는 앞뒤 끝을 확인하고, indexOf는 위치 또는 -1을 반환합니다.

TypeScript와 JavaScript의 문자열은 다른가요?

아니요. 런타임에서는 같은 메서드를 가진 같은 JavaScript 문자열입니다. TypeScript는 string 타입을 더하고, 존재하는 메서드를 호출하는지 검사하며, 반환 타입도 압니다. 예를 들어 match는 null을, at은 undefined를 반환할 수 있다는 것을 압니다.

TypeScript 문자열의 한 글자를 바꿀 수 있나요?

없습니다. 문자열은 불변이며 s[0] = "H"는 컴파일 오류 TS2542(Index signature in type 'String' only permits reading)입니다. 대신 새 문자열을 만드세요: "H" + s.slice(1).

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기