Uma string em TypeScript é uma string do JavaScript com o tipo string. Para interpolação, escreva um template literal: crases com marcadores ${expression}. Aspas simples e duplas criam strings simples, sem interpolação.
Os três estilos de aspas produzem o mesmo tipo, string. O primeiro $ em $${...} é um cifrão literal; só ${ inicia um marcador.
Interpolação de strings
Dentro de ${ } você pode colocar uma variável, uma conta, uma chamada de função, um ternário ou um template literal aninhado. O valor é convertido em string do mesmo jeito que String(value) faria (a exceção é symbol: interpolar um é o erro de compilação TS2731, e em tempo de execução lançaria um TypeError; escreva String(sym)).
Interpolar um objeto imprime [object Object], o que quase nunca é o que você quer. Escolha os campos ou use JSON.stringify(obj).
Strings de várias linhas
Um template literal pode ocupar várias linhas. As quebras de linha são mantidas, assim como qualquer indentação no início de cada linha, porque tudo o que está entre as crases faz parte da string.
Quando a indentação do seu código vazaria para dentro da string, monte-a com um array e join("\n"), ou deixe as linhas do template literal encostadas no início da linha.
Verificando se uma string contém uma substring
includes responde "contém ou não" com um boolean. startsWith e endsWith verificam as pontas. indexOf dá a posição, ou -1 quando a substring não aparece. Todos diferenciam maiúsculas de minúsculas.
includes também aceita uma posição inicial: file.includes("R", 1) só procura a partir do índice 1.
Métodos comuns e seus tipos
O TypeScript conhece o tipo de retorno de todo método nativo. Os que podem voltar vazios são os que merecem atenção, porque com strict você precisa tratar null ou undefined antes de usar o resultado.
| Método | Retorna | Exemplo |
|---|---|---|
includes, startsWith, endsWith | boolean | "abc".includes("b") é true |
indexOf, lastIndexOf | number (-1 se não houver) | "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 (propriedade) | number | "abc".length é 3 |
O acesso por índice simples, s[5], tem o tipo string mesmo quando o índice passa do fim (onde o valor em tempo de execução é undefined). A opção de compilador noUncheckedIndexedAccess faz com que ele seja string | undefined.
Strings são imutáveis
Não dá para alterar um caractere no lugar. O TypeScript aponta a atribuição a um índice como o erro TS2542, Index signature in type 'String' only permits reading., e no JavaScript em modo strict para o qual o código é compilado a mesma atribuição lançaria um TypeError em tempo de execução. Todo método que parece modificar uma string retorna uma nova.
Para transformar outros valores em strings, ou strings em números, veja string para número.
Tipos literais de string
string aceita qualquer texto. Um tipo literal de string aceita um único valor exato, e uma union deles forma um conjunto de strings permitidas, parecido com um enum:
Os tipos literais são verificados só em tempo de compilação; em tempo de execução label("deleted") ainda rodaria e imprimiria Post is deleted, que é o que a segunda linha faz aqui. A sintaxe de template literal também funciona no nível dos tipos, como em type EventName = `on${string}`, que aceita qualquer string que comece com on.
Perguntas frequentes
Como fazer interpolação de string no TypeScript?
Use um template literal: crases com marcadores ${expression}, como em `Hello, ${name}!`. Qualquer expressão funciona dentro das chaves, e o resultado tem o tipo string. Aspas simples e duplas não fazem interpolação.
Como escrever uma string de várias linhas no TypeScript?
Coloque o texto entre crases e quebre as linhas no código: um template literal mantém as quebras de linha e também a indentação no início de cada linha. Outra opção é juntar um array de linhas com .join("\n") ou usar \n dentro de uma string comum.
Como verificar se uma string contém uma substring no TypeScript?
Chame text.includes("part"), que retorna um boolean. Ele diferencia maiúsculas de minúsculas, então compare strings em minúsculas para uma verificação sem essa diferença: text.toLowerCase().includes(part.toLowerCase()). startsWith e endsWith verificam as pontas, e indexOf retorna a posição ou -1.
Existe diferença entre strings no TypeScript e no JavaScript?
Não, em tempo de execução são as mesmas strings do JavaScript, com os mesmos métodos. O TypeScript acrescenta o tipo string, verifica se você chama métodos que existem e conhece os tipos de retorno, por exemplo que match pode retornar null e at pode retornar undefined.
Dá para alterar um caractere de uma string no TypeScript?
Não. Strings são imutáveis, e s[0] = "H" é o erro de compilação TS2542 (Index signature in type 'String' only permits reading). Crie uma nova string: "H" + s.slice(1).