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, endsWith | boolean | "abc".includes("b")는 true |
indexOf, lastIndexOf | number(없으면 -1) | "abc".indexOf("c")는 2 |
slice, substring | string | "hello".slice(1, 3)은 "el" |
split | string[] | "a,b".split(",")는 ["a", "b"] |
trim, trimStart, trimEnd | string | " x ".trim()은 "x" |
toUpperCase, toLowerCase | string | "Ts".toUpperCase()는 "TS" |
padStart, padEnd | string | "7".padStart(3, "0")은 "007" |
replace, replaceAll | string | "a-b-c".replaceAll("-", "")는 "abc" |
repeat | string | "ab".repeat(2)는 "abab" |
at | string | undefined | "abc".at(-1)은 "c" |
match | RegExpMatchArray | 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).