Type Annotations
Definição
O TypeScript tem a inferência de tipos, ou seja, não é necessário definir o tipo da variável explicitamente, apenas quando o mesmo já foi inicializado.
O type annotation é definido com : [tipo]
após o nome da variável.
Tipos primitivos no TypeScript
any
É o tipo genérico do TypeScript, ou seja, quando ele não conseguir inferir o tipo é definido como any
.
-
any implícito:
function showMessage(msg: any) { return msg; }
-
any explícito:
function showMessage(msg) { return msg; }
msg
é do tipoany
.
string
let someString: string = "Luiz";
number
(integer, float, hexadecimal, binário e octal)
let integer: number = 30;
let negativeInteger: number = -30;
let float: number = 3.14;
let negativeFloat: number = -3.14;
let hexadecimal: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o7744;
boolean
let someBoolean: boolean = true;
symbol
let someSymbol: symbol = Symbol("qualquer-symbol");
bigint
(disponível apenas nas versões ES2020 ou superior)
let bigNumber: bigint = 10n;
array
É possível utilizar generics ou a notação de array ([]
).
let arrayOfNumberGeneric: Array<number> = [1, 2, 3];
let arrayOfNumber: number[] = [1, 2, 3];
let arrayOfStringsGeneric: Array<string> = ["a", "b", "c"];
let arrayOfStrings: string[] = ["a", "b", "c"];
object
É possível utilizar as seguintes formas para declarar o tipo de um objeto:
-
object
:const objetoA: object = { chaveA: "Valor A", chaveB: "Valor B", };
Não é recomendado definir explicitamente o tipo de um objeto com
object
. -
type aliases:
// Assinatura da propriedade: (property) adult?: boolean | undefined ^ | let person: {name: string, age: number, adult?: boolean} = { name: 'Luiz', age: 30 }
OBS: em
adult?: boolean
a?
indica que um compo de um objeto é opcional -
Notação de objeto (
{}
):const objetoA: {} = { chaveA: "Valor A", chaveB: "Valor B", };
-
Record
:Ao utilizar o
Record
com o tipounknown
, desabilita o intellisense da IDE, uma vez que esse tipo está acima do tipoany
na hierarquia.const objetoA: Record<string, unknown> = { chaveA: "Valor A", chaveB: "Valor B", };
-
Index signature:
const objetoA: { [key: string]: unknown; // chave opcional } = { chaveA: "Valor A", }; objetoA.chaveA = "Nova chave A";
function
function sum(x: number, y: number): number {
return x + y;
}
// Assinatura da função: function sum(x: number, y: number): number
^
|
function sum(x: number, y: number) {
return x + y;
}
// Assinatura da função anônima: const sumArrowFunction: (x: number, y: number) => number
^
|
const sumArrowFunction: (x: number, y: number) => number = (x, y) => x + y;
O tipo de retorno é inferido com base nos parâmetros da função. Caso uma função não tenha o
return
, o TypeScript infere o tipo de retorno comovoid
(sem retorno)
void
Indicar que uma função não tem retorno.
function semRetorno(...args: string[]): void {
console.log(args.join(" "));
}
const pessoa = {
nome: "Luiz",
sobrenome: "Otávio",
exibirNome(): void {
console.log(this.nome + " " + this.sobrenome);
},
};
tuple
O tipo tuple
é exclusivo do TypeScript.
Esse tipo é parecido com um array, porém nele é possível armazenar vários tipos de dados. Dessa forma, os métodos do array também funcionam na tupla.
-
Sintaxe básica de uma tupla:
const tuple: [number, string, string?] = [1, "Luiz", "Otávio"]; console.log(tuple); // [ 1, 'Luiz', 'Otávio' ]
-
Tupla imutável:
const tuple: readonly [number, string] = [1, "Luiz"]; console.log(tuple); // [ 1, 'Luiz' ]
const tuple: ReadonlyArray<string> = ["Luiz", "Otávio"]; console.log(tuple); // [ 'Luiz', 'Otávio' ]
never
É um type annotation do TypeScript para representar um que uma função nunca retorna nada.
Geralmente, quando uma função retorna never
, é porque ele lança um erro ou trava a aplicação.
IMPORTANTE:
void
é diferente denever
export function createError(): never {
throw new Error('Error');
}
createError();
unknown
É a classe “pai” de todos os tipos do TypeScript.
Ao definir uma variável com esse tipo, é necessário verificar o seu tipo antes de utilizá-la.
let x: unknown;
x = 100;
x = 'Luiz';
x = 900;
x = 100;
const y = 800;
if (typeof x === 'number') console.log(x + y);
undefined
Serve para indicar que uma propriedade (não) será definida.
let x;
if (typeof x === 'undefined') {
x = 20;
}
console.log(x * 2); // 40
null
É a representação de um valor inexistente ou “vazio”.
export function squareOf(x: any) {
if (typeof x === 'number') {
return x + x;
}
return null;
}
const squareOfNumber = squareOf(2);
if (squareOfNumber === null) {
console.log('Conta inválida.');
} else {
console.log(squareOfNumber);
}
const squareOfString = squareOf('2');
if (squareOfString === null) {
console.log('Conta inválida.');
} else {
console.log(squareOfString);
}
/*
4
Conta inválida.
*/
Exemplo
let name: string = "Luiz";
// let name: string
^
|
let name = 'Luiz';